iOS应用跳转的思考(一)

2017-04-24  本文已影响0人  夏天的风_song

一、几种不同的跳转

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

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

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

参考:关于iOS应用的跳转

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

1.png 2.png
 //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.

代码设置:

- (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;
}
- (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、优点:
2、缺点:

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跳转,传参数的问题,等一篇文章,我们在一起探讨一下
上一篇 下一篇

猜你喜欢

热点阅读