一、应用场景
单点授权登录,第三方分享,第三方登录
二、跳转方法
例如手机有两个应用,app1和app2,app1跳转到app2,步骤如下:
-
app2中设置URL Schemes
- 从app1中跳转到app2的代码
// 方法1 openURL (iOS2 ~ iOS10)
NSURL *url = [NSURL URLWithString:@"app2://"];
[[UIApplication sharedApplication] openURL:url];
// 方法2 openURL:options:completionHandler: (iOS10 ~)
- openURL这个方法iOS10开始已经失效,不过在Xcode8 iOS10测试仍然有效
- 执行方法1或方法2后,手机中如果装了app2,那么直接跳转到app2
- 手机中如果没有装app2(打开了一个不存在的URL Schemes),应用不会闪退也没有发现有何异常
- openURL:options:completionHandler:这个方法中,options中如果传一个空的字典,那么跳转的效果与openURL一样。
- openURL:options:completionHandler: 这个方法中是异步的,并且没有返回值,completionHander 这个回调block是在主线程中执行的。
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"跳转成功");
} else {
NSLog(@"跳转失败");
}
}];
- 应用跳转就这么简单~~
- 关于白名单的设置和说明
一般从app1跳转到app2,跳转前需要判断手机中app2是否存在,如果存在才进行跳转,如果不存在,需要提示用户,否则点击跳转后没任何效果的话可能会被苹果拒绝上架,判断手机中的某个应用是否存在的方法如下:
NSURL *url = [NSURL URLWithString:@"app2://"];
[[UIApplication sharedApplication] canOpenURL:url];
- iOS9开始,如果要正确执行canOpenURL这个方法,必须要在Info.plist中设置白名单,如果没有设置白名单,Xcode控制台会输出如下错误日志
- canOpenURL: failed for URL: "app2://" - error: "This app is not allowed to query for scheme app2"
白名单设置方法如下所示:
- 注意,白名单的设置只会影响canOpenURL这个方法,对openURL无影响,网上很多文章对这块描述有误导。
三、应用间传值
传值主要通过URL的方式,URL示例如下:
@"app2://oauth?param1=xxxxx¶m2=yyyy"
app1成功跳转到app2后,需要在app2的AppDelegate的代理方法中对URL作参数解析,示例如下:
// 方法一
// NS_DEPRECATED_IOS(2_0, 9_0)
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return YES;
}
// 方法二
// NS_DEPRECATED_IOS(2_0, 9_0)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return YES;
}
// 方法三
// NS_AVAILABLE_IOS(9_0)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSLog(@"%@", options);
/* options 打印结果
{
UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
UIApplicationOpenURLOptionsSourceApplicationKey = "com.epoint.app1"; // 可获取Bundle id
}
*/
//将url转为字符串
NSString * urlString = url.absoluteString;
//判断是通过什么跳转过来的
if ([urlString containsString:@"app2"]) {
NSLog(@"在这里执行页面跳转即可。");
ViewController *vc = (ViewController *)self.window.rootViewController;
vc.label.text = url.absoluteString;
}
return YES;
}
- app1跳转到app2,如果app2是后台彻底杀死状态打开,也会执行上述代理方法。
- 在 iOS 9 及 iOS 10 中,如果同时实现了上面三个方法,那么只会调用方法三
- 在 iOS 9 及 iOS 10 中,如果仅实现了方法一与方法二,那么仅调用方法二
- 在 iOS 9 及 iOS 10 中,如果仅实现了方法一,那么就调用方法一