美文网首页
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应用跳转到appstore评分

    iOS应用跳转到appstore评分 标签(空格分隔): IOS 跳转到应用评价页 跳转到应用详情页 appid是...

  • iOS应用跳转的思考(一)

    一、几种不同的跳转 1、我们在应用中跳转系统设置界面的方法: 在iOS8及以上的系统中,我们可以这样设置: 2、应...

  • iOS应用内跳转到系统设置页面

    iOS应用内跳转到系统设置页面 iOS应用内跳转到系统设置页面

  • 应用之间的跳转和数据传递

    iOS开发拓展篇—应用之间的跳转和数据传递 IOS APP之间跳转通讯 应用之间调用 UIApplication类...

  • OpenUrl

    iOS-使用URL Schemes,进行应用之间跳转iOS - JLRoutes路由跳转官方文档JLRoutes ...

  • IOS 页面切换

    写ios应用的页面切换不比写网页容易,网页应用可通过路由控制页面的跳转,而 ios 应用没有路由概念,所以页面跳转...

  • 俩个应用间的循环跳转

    应用跳转是根据协议头跳转 A跳转B,需要B增加URL Types ,A应用根据URL的协议头跳转 iOS8之前的跳...

  • 获取plist中的URL Schemes

    最近在写的项目中涉及到了应用间的跳转实现,iOS实现跳转应用是通过 openURL:方法; 此时遇到多个应用跳转到...

  • iOS应用内跳转到系统设置页面

    目前主要适配 IOS 8.0以后系统 当 iOS系统版本 >= iOS8,支持跳转到自己应用设置,不支持跳转到系统...

  • iOS打开应用的设置界面

    iOS8 + 应用如果请求过权限,就会在跳转到应用的设置界面.否则跳转到手机的设置界面 .

网友评论

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

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