美文网首页工作生活iOS
iOS - 应用间跳转

iOS - 应用间跳转

作者: 厦门_小灰灰 | 来源:发表于2019-07-01 18:29 被阅读0次

    在平常的开发中,会经常遇到从我们自己的App跳转到其他App,如微信分享,第三方支付,使用系统的内置程序等;

    应用跳转原理

    通过应用程序的自定义的协议头(URL Schemes),只需配置应用程序的协议头即可。
    比如有两个应用,一个是应用A,一个是应用B

    • 通过设置应用B的URL Schemes,应用B将其自身“绑定”到一个自定义URL Schemes上,就可以从应用A中利用应用B的URL Schemes启动应用B;
    配置URL Schemes
    配置URL Schemes.png

    这里有个点需要注意:

    • iOS9之前不需要设置白名单,就可以实现跳转;
    • iOS9之后,要跳转应用的URL Schemes添加到白名单中(白名单在Info.plist设置,对应的key为LSApplicationQueriesSchemes),否则不能使用;


      LSApplicationQueriesSchemes.png

    接下来通过代码来实现应用间的跳转,事先先创建两个应用,然后将各自的URL Schemes配置为AppA和AppB,并且设置白名单。

    1. 应用A跳转应用B
    AppA跳转AppB.gif
    - (IBAction)jumpToAppB:(id)sender {
        
        NSURL *url = [NSURL URLWithString:@"AppB://"];
        
        //判断是否可以打开应用B
        if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
            [[UIApplication sharedApplication] openURL:url];
        } else {
            NSLog(@"无法打开应用B");
        }
        
    }
    
    2. 应用A跳转应用B,打开指定页面
    • 在应用B中创建两个页面。


      两个页面.png
    • 代码

    - (IBAction)jumpToAppBHomePage:(id)sender {
        
        NSURL *url = [NSURL URLWithString:@"AppB://home"];
        
        //判断是否可以打开应用B
        if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
            //打开应用程序App-B的Home页面
            [[UIApplication sharedApplication] openURL:url];
        } else {
            NSLog(@"无法打开应用B");
        }
        
    }
    
    - (IBAction)jumpToAppBDetailPage:(id)sender {
        
        NSURL *url = [NSURL URLWithString:@"AppB://detail"];
        
        //判断是否可以打开应用B
        if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
            //打开应用程序App-B的Detail页面
            [[UIApplication sharedApplication] openURL:url];
        } else {
            NSLog(@"无法打开应用B");
        }
        
    }
    
    • 在应用B的AppDelegate中,重写
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    {
        //注意:这里只是简单的跳转页面,具体跳转还是要跟实际相关,比如是是在当前页面在打开新页面,还是要回到首页在打开新页面
        UIViewController *rootVC = self.window.rootViewController;
        
        if ( [url.absoluteString containsString:@"home"] ) {
            //跳转Home页面
            HomeVC *homeVC = [[HomeVC alloc] init];
            [rootVC presentViewController:homeVC animated:YES completion:nil];
        } else if ( [url.absoluteString containsString:@"detail"] ) {
            //跳转Detail页面
            DetailVC *detailVC = [[DetailVC alloc] init];
            [rootVC presentViewController:detailVC animated:YES completion:nil];
        }
    
        
        return YES;
    }
    

    效果图就不给出了。自己补脑。嘻嘻!

    3. 应用A跳转应用B后,应用B在跳转会应用A

    从应用B再跳转回应用A,那么在跳转到应用B的时候,要将应用A的URL Schemes传递过来。
    URL的规则:
    应用B的协议头://额外的参数?应用A的协议头
    其中:? 是分割符

    具体怎么保存应用A的协议头,就看具体页面,看是保存为局部变量还是全局变量,在需要的时候在拿出来使用。记得要在协议头后面拼接上://

    简单代码如下

        //比如应用A跳转的地址为:AppB://home?AppA
        //这边假设上面的AppB://home?AppA 存储在局部变量中 urlString
        NSString *jumpUrlScheme = [[self.urlString componentsSeparatedByString:@"?"] lastObject];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://", jumpUrlScheme]];
        
        //判断是否可以打开应用B
        if ( [[UIApplication sharedApplication] canOpenURL:url] ) {
            //打开应用程序App-B的Home页面
            [[UIApplication sharedApplication] openURL:url];
        } else {
            NSLog(@"无法打开应用");
        }
    

    over!

    相关文章

      网友评论

        本文标题:iOS - 应用间跳转

        本文链接:https://www.haomeiwen.com/subject/buqncctx.html