iOS应用之间的跳转解析

欢迎你们关注个人公众号,我会按期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来
javascript

文章也会同步更新到个人博客:
ppsheep.comjava

咱们先来看一下效果图git

这是从一个APP直接跳到另一个APP的效果

1

这是从一个APP跳到另外一个APP的指定页面

说明

在开发之中咱们常常遇到须要从咱们当前程序跳入到另一个程序中,下面咱们来讲明一下这实现的过程github

常见的跳转场景

  • 使用第三方登陆时,须要跳转社交APP,好比常见的QQ、微信、淘宝、支付宝等
  • 分享咱们的消息到其余APP,最多见的就是分享到QQ和微信,推广咱们的APP
  • 第三方支付,微信和支付宝
  • 导航,跳转到地图类应用
  • 跳转到系统的APP,打电话,发短信,发邮件等

实现原理

咱们想要打开iOS中的一个应用,只须要拿到这个应用的协议头,咱们就能够实现从一个APP跳到另一个APPxcode

假设咱们如今有两个APP,APP-1和APP-2,须要从APP-1跳到APP-2
那么咱们就须要给APP-2绑定一个URL Schemes(自定义的应用协议头),在APP-1中咱们就能够实现用这个协议头跳到APP-2微信

一个APP直接跳到另一个APP实现

建立两个项目APP-1和APP-2app

在APP-2中,咱们来绑定URL Schemeside

3

在APP2的target中绑定协议头为 APP2url

而后咱们在APP-1中添加一个按钮 来实现,点击跳转spa

注意,这两个APP得在手机上都安装上,才能跳转

[btn1 addTarget:self action:@selector(jumpToApp2) forControlEvents:UIControlEventTouchUpInside];复制代码

跳转方法

- (void)jumpToApp2{
    //获取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://"];

    //判断手机中是否安装了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //打开APP2
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"没有安装APP2");
    }
    // ---------------若是是iOS9以前,上面代码就能够实现跳转了---------------------
    // ---------------iOS9以后须要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
    // ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}复制代码

在iOS9以后,跳转 咱们须要在APP中设置须要跳转的URL Schemes才能实现跳转 即在Info中添加LSApplicationQueriesSchemes键值对

5

而后咱们就能够实现跳转了

看一下效果

1

一个APP跳到另外一个APP的指定页面

这个实现起来也很简单的,首先在APP2中新建两个ViewController

而后在APP-1中添加两个按钮分别是跳转到不一样的页面

UIButton *btn1 = [[UIButton alloc] initWithFrame:CGRectMake(50, 150, 200, 30)];
[btn1 setTitle:@"跳转到第一个界面" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(jumpToApp2_1) forControlEvents:UIControlEventTouchUpInside];
btn1.backgroundColor = [UIColor redColor];
[self.view addSubview:btn1];

UIButton *btn2 = [[UIButton alloc] initWithFrame:CGRectMake(50, 200, 200, 30)];
[btn2 setTitle:@"跳转到第二个界面" forState:UIControlStateNormal];
[btn2 addTarget:self action:@selector(jumpToApp2_2) forControlEvents:UIControlEventTouchUpInside];
btn2.backgroundColor = [UIColor redColor];复制代码

跳转方法

- (void)jumpToApp2_1{
    //获取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://VC1"];

    //判断手机中是否安装了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //打开APP2的ViewController1
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"没有安装APP2");
    }
// ---------------若是是iOS9以前,上面代码就能够实现跳转了---------------------
// ---------------iOS9以后须要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
// ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}

- (void)jumpToApp2_2{
    //获取APP2的URL Scheme
    NSURL *appURL = [NSURL URLWithString:@"APP2://VC2"];

    //判断手机中是否安装了APP2
    if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
        //打开APP2ViewController2
        [[UIApplication sharedApplication] openURL:appURL];
    }else{
        NSLog(@"没有安装APP2");
    }
    // ---------------若是是iOS9以前,上面代码就能够实现跳转了---------------------
    // ---------------iOS9以后须要在应用程序中加上白名单,即在APP-1中加上APP-2的白名单---------
    // ----------------在APP-1的Info中 添加键值对LSApplicationQueriesSchemes---------------------------------

}复制代码

经过对跳转的协议头添加不一样的描述,来实现不一样的跳转

而后咱们在APP-2的delegate中 实现方法

// 由于如今xcode8 最低支持8.0 因此 我仍是用这个方法吧
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

    //获取根控制器
    UINavigationController *nvc = (UINavigationController *)self.window.rootViewController;
// ViewController *vc = nvc.childViewControllers.firstObject;

    //每次跳转都必需要在根控制器 这一点比较重要
    [nvc popToRootViewControllerAnimated:YES];

    //根据url判断须要展现的VC
    if ([url.absoluteString containsString:@"VC1"]) {
        ViewController1 *vc1 = [[ViewController1 alloc] init];
// [vc presentViewController:vc1 animated:YES completion:nil];
        [nvc pushViewController:vc1 animated:YES];
    }else if([url.absoluteString containsString:@"VC2"]){
        ViewController2 *vc2 = [[ViewController2 alloc] init];
        [nvc pushViewController:vc2 animated:YES];
    }

    return YES;
}复制代码

实现跳转监听,这样就能跳转到不一样的页面了

源代码放在了

github.com/yangqian111…

github.com/yangqian111…

相关文章
相关标签/搜索