iOS应用程序间的跳转

作者: YotrolZ | 来源:发表于2015-08-13 23:50 被阅读7633次

一.从应用A直接跳转到应用B

  • 以应用A(网易)与应用B(微信)说明,网易应用跳转至微信应用;
1.设置应用B的URL Types中的URL Schemes
设置URL Schemes
2.在应用A中添加一个跳转的按钮,并监听点击
- (IBAction)skipToWechat:(id)sender { 

    NSURL *url = [NSURL URLWithString:@"wechat://"];
    // 如果已经安装了这个应用,就跳转
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}
  • 注意点:
  • 一个URL是可以没有路径的,但是协议头必须的完整;
  • 只要协议头和对应的应用的URL Schemes一致,就可知跳转到对应的应用,与URL路径无关

二.从 应用A 跳转到 应用B 的制定的页面

1.设置应用B的URL Types中的URL Schemes,(这里不再赘述)
2.在应用A中添加一个跳转的按钮,并监听点击
// 跳转到微信的朋友圈页面
- (IBAction)skipToSession:(id)sender {

    NSURL *url = [NSURL URLWithString:@"wechat://session"];
    // 如果已经安装了这个应用,就跳转
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }   
}

// 跳转到微信的好友列表页面
- (IBAction)skipToSession:(id)sender {

    NSURL *url = [NSURL URLWithString:@"wechat://timeLine"];
    // 如果已经安装了这个应用,就跳转
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}
  • 备注:sessiontimeLine是我们自定义的,到时候根据这两个不同的路径分别进行不同的跳转(见下文)
3.在应用B中监听跳转,进行判断,执行不同的跳转
  • AppDelegate中实现下面的方法监听;
// 这个方法快失效了
//- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//
//    return YES;
//}

// 如果通过URL打开的这个应用就会调用这个方法,我们在这个方法里面进行判断并跳转到不同的页面
// url就是执行跳转时的url
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

    // 将URL转成字符串
    NSString *urlString = url.absoluteString;
    
    // 获取跟控制器
    UINavigationController *nav = (UINavigationController *)application.keyWindow.rootViewController;
    ViewController *vc = [nav.childViewControllers firstObject];
    
    // 每次跳转前必须是在跟控制器(细节)
    [nav popToRootViewControllerAnimated:NO];
    
    if ([urlString containsString:@"timeLine"]) { // 跳转到朋友圈
        // 根据segue标示进行跳转
        [vc performSegueWithIdentifier:@"jump2tiemLine" sender:nil];
    } else if ([urlString containsString:@"session"]) { // 跳转到好友列表
        // 根据segue标示进行跳转
        [vc performSegueWithIdentifier:@"jump2session" sender:nil];
    }
    
    return YES;
}
  • 注意点:我们通过URL打开的应用就会调用这个方法,不管这个应用是在后台还是杀死状态;

三.从 应用B 反跳转到 应用A

  • 细节分析:
  • 1.我们进行反跳的时候,要根据是谁跳转来的,然后跳转到相应的应用;也就是说,我们在进行跳转时要还要携带自身的一些数据,根据这个数据反跳到对应的应用;
  • 2.制作一个规定:我们跳转的时候将自己的URL Schemes携带过来,如下:
@"wechat://timeLine?news"
 - 说明:
      `wechat://`:将要跳转到的应用的`URL Schemes`;
      `timeLine`:用于区分跳转到应用的哪个页面;
      `?`:分隔符
      `news`:自身的`URL Schemes`,配置方法与上面的一样
  • 3.获取数据应用跳转前的数据,并反跳回去
    • 1.在应用B的- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;方法中,我们能够获取完整的URL(也就是wechat://timeLine?news),所以在跳转前的控制器中添加一个属性,用于保存;
    • 2.重写这个控制器的- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;方法,这样我们能够根据segue.destinationViewController获取要跳转到的控制器;
    • 3.在要跳转到的控制器中定义一个属性,用于接受,并截取,拼接成合法的URL(此时的URL已经是跳转前的那个应用的URL Schemes),执行跳转即可返回对应的应用

相关文章

  • iOS应用程序间的跳转

    一.从应用A直接跳转到应用B 以应用A(网易)与应用B(微信)说明,网易应用跳转至微信应用; 1.设置应用B的UR...

  • 应用程序间跳转

    应用程序间跳转 1. 什么是应用间跳转,有什么作用? 2. 应用程序间跳转实现? 直接打开对应APP的scheme...

  • 应用程序间跳转和社交分享

    一. 应用程序间跳转 1. 什么是应用间跳转,有什么作用? 2. 应用程序间跳转实现? 直接打开对应APP的sch...

  • 看别人博客留存的重要知识:iOS应用程序间相互跳转

    应用间相互跳转简介 在iOS开发的过程中,我们经常会遇到需要从一个应用程序A跳转到另一个应用程序B的场景。这就需要...

  • 应用间跳转(Swift)

    一.应用跳转的介绍 1.应用间跳转即从一个应用程序跳转到另一个应用程序 2.应用间跳转的应用:1.应用推荐2.支付...

  • 应用程序间跳转

    第一个APP 添加标记 添加白名单 设置跳转url和返回标记 跳转到其他APP的指定页面 第二个APP 设置标记和...

  • 本地通知

    iOS7 iOS8要获取用户允许 接收到通知时带参数应用程序跳转

  • 应用间跳转

    iOS 9.0之后 应用程序跳转 需要设置白名单info.plist 增加 LSApplicationQueri...

  • 11-UI补充(2)

    0813-应用跳转、社交分、享推送通知 应用跳转 要点(04-应用间跳转跳转到固定界面和返回应用程序) 流程:...

  • iOS 应用程序的跳转

    一. 应用程序间通信 例如,要在Safari应用程序中打开Google主页,我们可以编写如下代码: 这里的http...

网友评论

  • hou_8:亲 这个方法应该很固定吧 应用间跳转也就这个方法了
  • 536ad7d5b3b6:亲,不同页面跳转那里// 获取跟控制器
    UINavigationController *nav = (UINavigationController *)application.keyWindow.rootViewController;
    ViewController *vc = [nav.childViewControllers firstObject];
    这些代码没必要吧,这个方法本来就是在APPDelegate中写的,我们直接获取当前视图控制器的window的根视图控制器就好了嘛,你在应用B中找到sourceApplication根本就是错误的呀?请指教.
    海龙lv:再就是这个跟控制器如果是tabbarController的话,这样取的话也是不正确的
  • dibadalu:请问,我需要跳转到一个从app store下载的应用,要怎么知道该应用的协议头?
    海龙lv:这个直接将这个应用的下载的地址整过来进行跳转就行了
    dibadalu:@YotrolZ 已经知道了,https://www.reddit.com/r/workflow/comments/2tlx29/get_url_scheme_of_any_app/。谢谢
    YotrolZ:可以参考微信分享之类的跳转
  • 会跳舞的狮子:iOS9.0之后需要设置白名单
    YotrolZ:@lesmiserables0 设置自己app的URLscheme
    lesmiserables0:嗯,那么回跳的白名单怎么设置,就是跳到微信,然后不能回跳。
  • 042a0e1be73f:3.在应用B中监听跳转,进行判断,执行不同的跳转
    这一节的代码时什么意思啊,加了断点,根本不执行啊!

    - (IBAction)skipToSession:(id)sender {

    NSURL *url = [NSURL URLWithString:@"wechat://session"];
    // 如果已经安装了这个应用,就跳转
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
    }
    }
    只要这一段代码不就可以跳转了吗?
    冯半仙儿:@iiOS - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options;
    042a0e1be73f:@YotrolZ 谢谢啦,貌似懂了!- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;这个方法在iOS9中好像被淘汰了。。。
    YotrolZ:@小小小读者 有时候我们要从应用A跳转到应用B的指定页面、好比从QQ跳转到微信的朋友圈、或者微信的好友界面、而不仅仅是打开微信的初始默认页面。

本文标题:iOS应用程序间的跳转

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