认识URL Schemes

作者: 0o冻僵的企鹅o0 | 来源:发表于2015-11-16 18:11 被阅读17398次

    2017.12.28更新,更新内容:

    • 在Xcode 9 下,新建的工程,在plist文件中注册URL Schemes,从safari无法打开问题

    • URL Scheme是什么
    • URL Scheme有什么作用
    • URL Scheme怎么使用

    URL Scheme是什么

    由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。

    URL Scheme有什么作用

    那么app之间的跳转有什么作用呢?我们所使用的每一个app就相当于一个功能,app的跳转可以使得每个app就像一个功能组件一样,帮助我们完成需要做的事情,比如三方支付,搜索,导航,分享等等。

    URL Scheme怎么使用

    要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,我们常见的跳转协议有下面这些:

        1.打开Mail
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://info@icloud.com"]]
        2.打开电话
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18688886666"]];
        3.打开SMS
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:18688886666"]];
    

    所以,如果我们希望别人打开我们的app,只要在plist文件中配置一下你的跳转协议即可,如下图所示:


    跳转协议配置.jpg

    “emp601602://”就是我的跳转协议了,编译一下app,在safari中输入“emp601602:// ”就可以跳转到我的app中。

    但是在Xcode 9 下,新建的工程,在plist文件中注册URL Schemes,是无法从safari启动app的。
    需要在如下位置注册URL Schemes,

    6D948732-FF67-4F7E-8D52-5CA246F93961.png

    “emp601602:// ”只能让用户跳转到我们的app,之后的处理是在appDelegate的代理中,代理方法如下:

    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation
    

    在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个 URL 进行判断,例如根据不同的 Host,不同的 Query String 来执行不同的动作。

    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation
    {
        NSLog(@"%@", [url absoluteString]);
        
        // 在 host 等于 item.taobao.com 时,说明一个宝贝详情的 url,
        // 那么就使用本地的 TBItemDetailViewController 来显示
        if ([[url host] isEqualToString:@"item.taobao.com"]) {
            
            // 这里只是简单地假设 url 形式为 taobao://item.taobao.com/item.htm?id=12345678
            // 先获取要查看的宝贝详情的 itemId
            NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
            
            // 使用本地 ViewController 来显示淘宝商品详情
            TBItemDetailViewController *controller = [[TBItemDetailViewController alloc] initWithItemId:itemId];
            [self.navigationController pushViewController:controller animated:YES];
        }
    }
    

    在你的动作执行完成了之后,有可能时需要返回到原有app的,这样就需要你的app跳转协议的url里面应该能传入调用者app的跳转协议,这样用户跳转到你的app完成动作后就能跳转回去了。

    最后附上一些好玩有趣的iOS URL Scheme,来自知乎:
    http://www.zhihu.com/question/19907735

    补充一下iOS 10 下跳转问题:
    iOS 10 支持通过 URL Scheme 跳转到系统设置
    iOS10跳转系统设置的正确姿势
    关于 iOS 系统功能的 URL 汇总列表
      end.Have fun~

    参考文章:
    http://xujiwei.com/blog/2011/09/ios-app-custom-url-scheme-design/
    http://blog.csdn.net/wbw1985/article/details/26264029
    iOS URL Schemes 的定义和使用
    你所知道好玩有趣的 iOS URL Scheme 有哪些?
    iOS 组件化 —— 路由设计思路分析

    相关文章

      网友评论

      • zhigangcoding:您“URL Scheme是什么?”里面对于两个相同URL Schemes描述错了,如果两个应用有URL Schemes是相同的,后安装的应用的URL Schemes会把早安装的应用的URL Schems覆盖掉。而不是你说的:“那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。”
        0o冻僵的企鹅o0:我又在我的手机上(iPhone SE,iOS 10.3.3)和模拟器(iPhone 8Plus)测试了一下,是先响应的先安装的app。你是如何测试的?
      • 鱼与熊掌不能兼得:大神,有demo吗
      • E时代E起飞:不错,通俗易懂

      本文标题:认识URL Schemes

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