iOS应用间跳转详解

一、应用场景

单点授权登录,第三方分享,第三方登录

二、跳转方法

例如手机有两个应用,app1和app2,app1跳转到app2,步骤如下:

  1. app2中设置URL Schemes


    iOS应用间跳转详解_第1张图片
    URL Schemes设置方法
  2. 从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(@"跳转失败");
        }
    }];
  • 应用跳转就这么简单~~
  1. 关于白名单的设置和说明
    一般从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 *)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 中,如果仅实现了方法一,那么就调用方法一

你可能感兴趣的:(iOS应用间跳转详解)