美文网首页
iOS应用跳转的思考(一)

iOS应用跳转的思考(一)

作者: 夏天的风_song | 来源:发表于2017-04-24 18:22 被阅读0次

    一、几种不同的跳转

    1、我们在应用中跳转系统设置界面的方法:

    在iOS8及以上的系统中,我们可以这样设置:

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    
    2、应用间的跳转

    参考:关于iOS应用的跳转

    比方说,从A应用跳转到B应用。

    • 在B应用中注册跳转的URL(这个URL你随便写,我这只是个示例)
    1.png
    • 在A中添加白名单, iOS9开始必须在info.plist文件中添加白名单LSApplicationQueriesSchemes才可以跳转 否者报错
    2.png
    • 在A应用中打开(在需要跳转的地方加上下面的代码,注意URL要跟在上一步中注册的一致才能打开喔)
     //iOS10之后,隐私政策有了改变,需要用新的方法打开跳转应用的URL
        NSURL *url = [NSURL URLWithString:@"APPSkip://" ];
        if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
            
            [[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
                
            }];
        }else{
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
    
    3、打开应用的具体界面(接2、)

    A和B项目里的设置同2.

    代码设置:

    • 在B项目里设置打开具体界面的代码
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
    
        NSString *urlString = url.absoluteString;
        if ([urlString containsString:@"RedVC"]) {
            
            NextViewController *vc = [[NextViewController alloc]init];
            vc.view.backgroundColor = [UIColor redColor];
            UIViewController *rootVC =    self.window.rootViewController;
            [rootVC presentViewController:vc animated:YES completion:^{
                
            }];
            
        }else if ([urlString containsString:@"BlueVC"]){
            NextViewController *vc = [[NextViewController alloc]init];
            vc.view.backgroundColor = [UIColor blueColor];
            UIViewController *rootVC =    self.window.rootViewController;
            [rootVC presentViewController:vc animated:YES completion:^{
                
            }];
        }
        return YES;
    }
    
    • 在A项目里打开的B项目具体页面的调用代码
    - (IBAction)toFriend:(UIButton *)sender {
        NSURL *url = [NSURL URLWithString:@"APPSkip://RedVC" ];
        if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
            
            [[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
                if (success) {
                    NSLog(@"success");
                }else{
                    NSLog(@"failure");
                }
            }];
        }else{
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
        
        
        
    
    }
    
    - (IBAction)toFriendCircle:(UIButton *)sender {
        
        NSURL *url = [NSURL URLWithString:@"APPSkip://BlueVC" ];
        if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
            
            [[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
                
            }];
        }else{
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
    
    }
    

    我在想,既然系统的APP都支持URL跳转,那我们自己的应用是否支持这种简单的用URL跳转的方式呢?

    于是,我试着在B项目里面(像在A项目一样调用)

    - (IBAction)buttonClick:(UIButton *)sender {
        
        NSURL *url = [NSURL URLWithString:@"APPSkip://BlueVC" ];
        if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
            
            [[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
                
            }];
        }else{
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
    
    }
    

    但是报了一个错误

    2017-04-24 17:21:58.641 APPSkip[10443:7204359] -canOpenURL: failed for URL: "APPSkip://BlueVC" - error: "This app is not allowed to query for scheme APPSkip"
    

    需要在B项目,把自己的URL加入白名单(LSApplicationQueriesSchemes我把这个拼出来,下次设置的时候可以直接复制粘贴)

    3.png

    重新运行,就可以正常跳转了,nice!

    二、这种跳转方式的优势和弊端(只是个人拙见啊,我只能想到这么多了,欢迎道友补充指正)

    1、优点:
    • 从别的应用跳转到本应用的时候可以指定具体界面,而不是固定跳转到主界面,对于像微信,QQ这样的,可能别的应用需要接入咱们的应用,这种情况来说,还是很适用(也就是说开放性比较好吧)
    2、缺点:
    • 你要在AppDelegate里面引入所有的UIViewController,并且指定跳转,也就是说初始化所有的UIViewController,内存常驻量就会比较大,当项目逐渐大了之后,就会产生性能瓶颈。

    3、解决对ViewController的引用依赖
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
    
        NSString *urlString = url.absoluteString;
        if ([urlString containsString:@"RedVC"]) {
            
            Class class = NSClassFromString(@"NextViewController");
            
            UIViewController* vc  = (UIViewController*)[[class alloc]init];
            vc.view.backgroundColor = [UIColor redColor];
            UIViewController *rootVC =    self.window.rootViewController;
            [rootVC presentViewController:vc animated:YES completion:^{
                
            }];
            
        }else if ([urlString containsString:@"BlueVC"]){
            
            Class class = NSClassFromString(@"NextViewController");
            
            UIViewController* vc  = (UIViewController*)[[class alloc]init];
            vc.view.backgroundColor = [UIColor blueColor];
            UIViewController *rootVC =    self.window.rootViewController;
            [rootVC presentViewController:vc animated:YES completion:^{
                
            }];
        }
        return YES;
    }
    
    4.png

    这样一来就解决了引用依赖的问题

    咱们可以用OC的runtime反射调用的方法解决引用依赖的问题

    Class cls = NSClassFromString(@"BookDetailComponent");
    id obj = [[cls alloc] init];
    return id;
    

    }

    
    下一步,我们重点解决应用内用URL跳转,传参数的问题,等一篇文章,我们在一起探讨一下

    相关文章

      网友评论

          本文标题:iOS应用跳转的思考(一)

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