美文网首页
iOS - 应用程序跳转schemes

iOS - 应用程序跳转schemes

作者: CDLOG | 来源:发表于2018-08-02 09:39 被阅读12次

1,应用程序互相跳转

要打开本机上的其他应用程序,需要设置schemes,自定义的协议头,可以打开其他的应用程序,如果要返回调用的应用程序,需要知道调用我们的应用程序的scheme,schemes其实就相当于url
设置要打开的程序的schemes,链接要打开的程序的schemes

2,设置schemes

被跳转的应用设置schemes:项目 -> info -> URL Types -> URL Scheme

3,跳转

要跳转的应用配置plist,设置schemes白名单,里面有才可以跳

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
    </array>

array里是每个schemes
跳转的代码

NSURL *url = [NSURL URLWithString:@"dididi://"];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    }else
    {
        NSLog(@"无法跳转");
    }

注意跳转时schemes加://

4,被跳转的应用被拉起时的代理方法

-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"%@  %@",url,options[UIApplicationOpenURLOptionsSourceApplicationKey]);
    
    return YES;
}

options[UIApplicationOpenURLOptionsSourceApplicationKey],代表是谁拉起的这个应用,但是是唯一的,不能区分不同的逻辑。所有可以使用同一个应用可以配置不同的scheme,来拉起同一个应用,根据scheme来判断是从哪个逻辑拉起的,来指向被拉起应用的不同界面或者执行不同的方法。这里有两种方法来处理。

5,跳转到拉起应用指定的界面

5.1判断指定协议的方式(协议不同),注意判断的时候scheme要加://,如dididi1://,同一个应用一般用协议加地址的方式,这里只是介绍一下这个方法。

-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"%@  %@",url,options[UIApplicationOpenURLOptionsSourceApplicationKey]);
    if ([@"dididi1://" isEqualToString:url.absoluteString ]) {
        UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
        
        
       ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController1"];
        
        [[UIApplication sharedApplication].keyWindow setRootViewController:VC];
    }
    return YES;
}

5.2同一个应用的不同界面一般用判断指定协议头+地址的方式或者只判断地址),如dididi://1,1就是地址,url.scheme拿到协议头(如http),url.host拿到url中的地址,注意不要://

优点:只需要配置一个scheme

//    协议+地址方式
    if ([@"dididi" isEqualToString:url.scheme]) {
        if ([@"1" isEqualToString:url.host]) {
            UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
            
            
            ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController1"];
            
            [[UIApplication sharedApplication].keyWindow setRootViewController:VC];
        }else if([@"2" isEqualToString:url.host]){
            UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
            
            
            ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController2"];
            
            [[UIApplication sharedApplication].keyWindow setRootViewController:VC];
        }else{
            UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
            
            
            ViewController1 * VC = [board instantiateInitialViewController];
            
            [[UIApplication sharedApplication].keyWindow setRootViewController:VC];
        }
    }

6,传递参数

NSURL *url = [NSURL URLWithString:@"dididi://1?wangyiDemo"];
?后面的参数,可以是跳转的应用的scheme,用于跳转回来,也可以是其他东西

//地址方式
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSURL *url = [NSURL URLWithString:@"dididi://1?wangyiDemo"];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    }else
    {
        NSLog(@"无法跳转");
    }
}

被拉起的应用接受参数

url.query 就是?后面的内容

注意:
1,跳转别人一定要设置白名单
2,被跳转一定要设置scheme

详细的demo在GitHubhttps://github.com/CDLOG/AppJumpDemo

相关文章

网友评论

      本文标题:iOS - 应用程序跳转schemes

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