iOS 9 通用链接(Universal Links)

作者: iOS_小松哥 | 来源:发表于2017-02-03 16:09 被阅读12479次

    什么是Universal Links?

    在iOS9之前,对于从各种从浏览器、Safari中唤醒APP的需求,我们通常只能使用scheme。但是这种方式需要提前判断系统中是否安装了能够响应此scheme的app,并且这种方式在微信中是被禁用了的。

    Universal Links是iOS9推出的一项功能,使你的应用可以通过传统的HTTP链接来启动APP(如果iOS设备上已经安装了你的app,不管在微信里还是在哪里), 或者打开网页(iOS设备上没有安装你的app)。

    下面简单说下怎么使用Universal Links,具体的可以看官方的说明文档

    怎么使用Universal Links

    1.先决条件:你必须有一个域名,且这个域名需要支持https。

    2.需要在开发者中心做配置:找到对应的App ID,在Application Services列表里有Associated Domains一条,把它变为Enabled就可以了。


    配置App ID支持Associated Domains

    3.打开工程配置中的Associated Domains,在其中的Domains中填入你想支持的域名,必须以applinks:为前缀。

    配置项目中的Associated Domains

    4.创建一个内容为json格式的文件,苹果将会在合适的时候,从我们在项目中填入的域名请求这个文件。这个文件名必须为apple-app-site-association,没有后缀名,文件内容大概是这样子:

    {
        "applinks": {
            "apps": [],
            "details": [
                {
                    "appID": "9JA89QQLNQ.com.apple.wwdc",
                    "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
                },
                {
                    "appID": "ABCD1234.com.apple.wwdc",
                    "paths": [ "*" ]
                }
            ]
        }
    }
    

    说明:

    appID:组成方式是 teamId.yourapp’s bundle identifier。如上面的 9JA89QQLNQ就是teamId。登陆开发者中心,在Account - Membership里面可以找到Team ID。

    paths:设定你的app支持的路径列表,只有这些指定的路径的链接,才能被app所处理。星号的写法代表了可识别域名下所有链接。

    这篇博客里有很多其他公司的例子,可以参考一下。也有可能有的公司的已经不再适用,可以换换其他公司的。

    5.上传该文件到你的域名所对应的根目录或者.well-known目录下,这是为了苹果能获取到你上传的文件。上传完后,自己先访问一下,看看是否能够获取到,当你在浏览器中输入这个文件链接后,应该是直接下载apple-app-site-association文件。

    验证

    在iOS设备中的备忘录中输入App能识别的链接,然后直接点击此链接,就会直接跳转到你的app了。或是长按,在出现的弹出菜单中第二项是在’XXX’中打开,这也代表着成功:

    出现菜单

    或是你将要测试的网址在safari中打开,在出现的网页上方下滑,可以看到有在”XX”应用中打开

    出现菜单

    在微信的网页浏览器中也是可以的,虽然微信屏蔽了所有的scheme方式跳转到其它app,但是Universal Links是由系统直接处理的,微信屏蔽不了,这也就实现了从微信跳转到我们的app。

    苹果为了方便开发者,提供了一个网页来验证我们编写的这个apple-app-site-association是否合法有效,进入验证网址进行验证:

    验证链接

    进入app后的处理

    现在用户点击某个链接,直接可以进我们的app了,但是我们的目的是要能够获取到用户进来的链接,根据链接来展示给用户相应的内容。
    我们需要在工程里的 AppDelegate 里实现方法

    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
    {
        if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])
        {
            NSURL *url = userActivity.webpageURL;
            if (url是我们希望处理的)
            {
                //进行我们的处理
            }
            else
            {
                [[UIApplication sharedApplication] openURL:url];
            }
        }
        
        return YES;
    }
    

    注意

    前端开发经常面临跨域问题,必须要求跨域,如果不跨域,就不行。
    只有当前webview的url域名,与跳转目标url域名不一致时,Universal Link 才生效。

    好了先说到这里,如果遇到什么问题可以详细看官方的说明文档

    欢迎关注 和我的专题:iOS技术交流,查看更多好文章。

    相关文章

      网友评论

      • 宋鸿康iOS:如果应用没有安装呢?第一次安装,能够获取携带的参数吗
      • r_66ed:window.onload中直接调用window.location.href = 'xxxxx'; xxxxx为通用链接,不能打开app,而是打开了通用链接的网页,为什么呢?
        向往7080:你们后来解决了吗?
        哄哄的薇薇:我也有一样的疑问🤔️
      • c山龙隐秀:很棒
        iOS_小松哥:@c山龙隐秀 是缘是情是童真还是意外
      • IOSMan:苹果那验证域名出现:Error no apps associated with url,从记事本可以跳到APP,微信不行,急急急
      • 从小玩到大的青梅竹马:是缘是情是童真还是意外
        iOS_小松哥:@从小玩到大的青梅竹马 特么的 反了你了
      • 进击的小矮人:我想问一下,开发者中心的Associated Domains 是自动变成enble 还是手动设置的。为什么,我什么都弄好了,就是没有跳转的选项
      • f6807b908a23:您好,我想问一下那个path具体指什么路径,我不是太明白.星号的写法代表了可识别域名下所有链接这句话什么意思.
      • 2bd7e62c5187:您好,我现在在备忘录和浏览器都能达到效果,唯独微信浏览器无法达到效果,在微信浏览器中点在Safari打开是直接进入我的应用,这是什么情况
        IOSMan:我也是这样,你解决了吗
      • 5a72722962dd:我想问一下那个json文件创建好放在哪里啊?
      • 路在脚下了:小松哥,这句话不是很理解(上传该文件到你的域名所对应的根目录或者.well-known目录下),怎么上传到你的域名所对应的目录下啊
        bd1cb34ea3d4:如果能把这个文件上传到百度 那访问百度不都是大开你们的app 岂不要天下大乱。这个必须是自己的服务器 至少有相关文件权限操作的web服务器
        清蒸鱼跃龙门:同问啊,他填的百度首页,这怎么上传文件上去的??
      • o翻滚的牛宝宝o:楼主,我有几个问题。第一我尝试了下别人的app,不需要https也能跳转。第二,微信还是跳转不了啊。
        o翻滚的牛宝宝o:@iOS_小松哥 恩,测试了下,聊天窗不行,web页面可以。我的应用不行可能是不支持https。申请个免费证书再试试。
        iOS_小松哥:@o翻滚的牛宝宝o 服务器需要https 跳转链接并不需要 微信需要在他的webview内 也可能有的已经失效了
      • Jaesun:松哥 666666
        iOS_小松哥:@dong136279559 跟我一起摇摆
        0271fb6f797c:666666:innocent:
        iOS_小松哥:@Jaesun 是缘是情是童真还是意外
      • NateLam:楼主, 请问怎么创建一个json格式的文件:flushed:
        NateLam:@iOS_小松哥 哦哦这样, 好哒, 谢谢我试试
        iOS_小松哥:@NateLam 其实就是一个没有后缀的文件 里面的文本是json格式 不会的话可以在终端vim 文件名 就可以了
        iOS_小松哥:@NateLam 其实就是一个没有后缀的文件 里面的文本是json格式 不会的话可以在终端vim 文件名 就可以了
      • Eddiegooo:666 Mark
        iOS_小松哥:@Eddiegooo :joy:
      • siliwen:感谢分享
        iOS_小松哥:@siliwen 就是我哼哼 程序员的世界就是这么小
        siliwen:@iOS_小松哥 你叫李松是吗?认不认识王亚云?我刚把你的文章分享到朋友圈,我们同事说认识你:smiley:
        iOS_小松哥:@siliwen :joy:
      • clevergilr:666
        iOS_小松哥:@clevergilr 999
      • 萧城x:666
        iOS_小松哥:@低调做事 德玛西亚!
      • chenyu1520:很不错
        iOS_小松哥:@chenyu1520 :joy:
      • 笨鸟后飞了:真6,不看还真不知道
        iOS_小松哥:@海东 是缘是情是童真还是意外
      • 幸福的李雨龙:6666
        iOS_小松哥:@幸福的李雨龙 :joy:
      • iDog:666
        iOS_小松哥:@加基特 是缘是情是童真还是意外
        加基特:6666666

      本文标题:iOS 9 通用链接(Universal Links)

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