一,简介
通用链接是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服务。
image2,在Xcode中开启Associated Domains服务
找到工程的Capabilities -> Associated Domains,打开此功能,在Domains中添加跳转域名,域名的格式为:
applinks:www.example.com
注:
①,你的服务器必须支持SSL;
②,Domains可以添加多个;
③,Domains必须以 applinks: 开头;
3,配置 apple-app-site-association 文件
苹果官方给出的格式如下图所示:
image其中apps项必须对应一个空的数组,details项对应一个字典的数组,其中appID对应项由前缀和ID两部分组成,可以在developer.apple.com中的Identifiers→AppIDs中点击对应的App ID查看。
imagepaths对应域名中的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的,必须要跨域才生效
网友评论