iOS的UniversalLink开发总结

作者: 崔可一 | 来源:发表于2017-02-24 11:40 被阅读4100次

    一,简介

    通用链接是Apple在WWDC2015上为iOS9引入的一个新功能,是通过传统HTTP链接来启动App的技术。可以使用相同的网址打开网站和App。通过唯一的网址,就可以链接到App中具体的视图,不需要特殊的schema。如果用户没有安装App则链接到对应的普通网页。

    二,对比URL Scheme跳转

    在iOS 9之前,我们从外部启动App都是通过URL scheme的方式进行跳转,开发者通过配置info.plist文件中的 URL Types 可以轻松实现跳转,而且现在苹果还对这种跳转的方式加了一个提示框:“是否打开XXX”,跳转过程也显得不流畅。

    而UniversalLink跳转方式可以实现无缝跳转,当浏览器识别到预先指定好的URL,就可以直接唤醒App,不需要在浏览器中打开再去点击其他按钮。

    三,开发步骤

    1,打开Associated Domains服务

    登录开发者账号,在Identifiers下AppIDs找到自己的App ID,编辑打开Associated Domains服务。

    image

    2,在Xcode中开启Associated Domains服务

    找到工程的Capabilities -> Associated Domains,打开此功能,在Domains中添加跳转域名,域名的格式为:

    applinks:www.example.com
    

    注:
    ①,你的服务器必须支持SSL;
    ②,Domains可以添加多个;
    ③,Domains必须以 applinks: 开头;

    image

    3,配置 apple-app-site-association 文件

    苹果官方给出的格式如下图所示:

    image

    其中apps项必须对应一个空的数组,details项对应一个字典的数组,其中appID对应项由前缀和ID两部分组成,可以在developer.apple.com中的Identifiers→AppIDs中点击对应的App ID查看。

    image

    paths对应域名中的path,用于过滤可以跳转到App的链接,支持通配符‘*’,‘?’以及‘NOT’进行匹配,匹配的优先级是从左至右依次降低。

    最后,需要把配置好的json文件上传到服务器中该域名的根目录下,也就是说,我们可以用GET请求可以获取到这个apple-app-association文件。

    当我们的App在设备上第一次运行时,如果支持Associated Domains功能,那么iOS会自动去GET定义的Domain下的apple-app-site-association文件。

    需要留意iOS会先请求 https://domain.com/.well-known/apple-app-site-association
    如果此文件请求不到,再去请求 https://domain.com/apple-app-site-association。 所以如果想要避免服务器接收过多GET请求,可以直接把apple-app-site-association放在./well-known/目录下。

    Tips

    服务器上apple-app-site-association的更新不会让iOS本地的apple-app-site-association同步更新,即iOS只会在App第一次启动时请求一次,以后除非App更新或重新安装否则不会在每次打开时请求apple-app-site-association。

    4,Xcode代码处理

    当服务器部署完成之后,我们需要在AppDelegate中实现代理方法:

    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
    

    具体实现如下:

    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
    return YES;
    }
    
    //读取url地址
    NSURL *jumpUrl = userActivity.webpageURL;
    // TODO: handle jump code
    
    return YES;
    }
    
    

    5,测试过程

    最简单的测试方法,是在系统的短信中点击一个URL直接跳转到App,点击之前定义的链接,如果能跳转到App内,就正明配置成功了。

    四,挖坑提示

    1,在Safari中点击链接打开App后,会发现App的右上角的navigationBar会有一串网址的链接箭头,如果你点击了它,它会跳转到Safari,同时系统会默认你选择用Safari来打开该域名的链接,而不用app打开,也就是说下次你再点击该链接,它只会在Safari中打开,不会在App中打开了。那么如何开启app跳转呢?有两种方法:第一种,在Safari页面中,手指往下拉一下页面,会显示一个“隐藏”的banner,俗称为 smart banner,右侧有一个button,点击它,就开启App跳转功能了。第二种,长按跳转链接,底下会弹出一些选项,选择在App中打开,同样可以开启这个功能。

    2,apple-app-site-association 文件注意格式是否正确,json格式中的引号是全角还是半角的。(特别注意一下这个问题,如果是中文的引号,点击链接不会跳转到App)

    五,总结

    1,apple-app-site-association不需要.json后缀。

    2,如果要对没有path的域名进行支持(如:www.163.com),在json文件的paths中用通配符’*’是不行的,需要在paths数组中加入’/’进行匹配。

    3,对json文件的请求仅在App第一次启动时进行,如果此时网络连接出了问题apple会缓存请求,等有网的时候再去请求,而实际测试抓包并没有请求故通用连接会失效。

    4,paths匹配的优先级是从左至右依次降低,但需要明确,否则会出问题。比如"paths":[ "NOT /together/",""],在IOS9.2上path为/together/*都不会跳到App,但是在IOS9.0上会跳到。

    5,从iOS 9.2开始,在相同的domain内Universal Links是不work的,必须要跨域才生效

    六,参考链接

    1)https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1 官网链接

    相关文章

      网友评论

        本文标题:iOS的UniversalLink开发总结

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