一、 通用链接介绍
Apple 推出通用链接:一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开网站和 APP。
当你的应用支持通用链接,iOS9 之后 , 用户可以点击一个链接跳转到你的网站,并获得无缝重定向到您安装的应用程序,而无需通过 Safari 浏览器。如果你的应用不支持的话,点击链接将会用 Safari 来打开。
二、 通用链接的关键实现条件
有一个注册的域名
域名可通过 SSL 访问(应该是需要有效的证书)
支持上传一个 JSON 文件到域名
iOS 9 以上版本
Xcode 7 以上
需要真机测试,模拟器不支持通用链接
web server 需要支持 https,客户端需要通告 https 访问,并且不支持任何重定向
说了这么多是时候来点干货了;
三、 通用链接实现步骤
1.在项目中开启Associated Domains 域
进入自己的项目的Targets->Capabilites->Associated Domains,设置成ON状态,这时候你会发现你的项目的文件夹下会多出一个.entitlements的文件
注意:我这里是使用了Xcode的自动管理证书,所以当我打开Associated Domains时Xcode会自动帮我处理证书配置问题以及appIDs打开Associated Domains。
如果你是使用手动管理证书,需在处理第1步之前先去自己的开发者账号找到对应的appIDs,勾选Associated Domains选项。具体操作步骤:
进入苹果Apple Developer -> Member Center -> Certificates, Identifiers & Profiles – >Identifiers - >App IDs–>Edit 然后开启打钩 Associated Domains 后保存。
如果证书设置正确以及App IDs的Associated Domains打开后,你再执行第1步操作之后Associated Domains下面的steps有2个对号,否则就会出现错号。
2.在Associated Domains下添加web端的域名
点击Associated Domains的+号填入applinks:后面是你的域名,例如我公司的是
applinks:×××××.mingpao.com
3 制作apple-app-site-association 文件
创建一个json格式的命名为apple-app-site-association文件,注意这个文件必须没有后缀名,文件名必须为apple-app-site-association!!!
{
"applinks":{
"apps":[],
"details":[
{
"appID": "G4E6298X77.com.mingpao.×××××",
"paths":[ "/*" ]
},
]
}
}
这里解释一下:
appID 是由你的Team ID+BundleID组成,如果你不知道你的Team ID是什么?进入苹果Apple Developer -> Member Center ->Membership->Team ID
paths 是一个字符串的数组,这里是你的应用支持的通用链接与不支持的链接,这里小编使用的是/*,代表着只要是Associated Domains域名下的所有的链接都支持。如果你不支持某一个链接,在这个链接前面加NOT空格,举个例子
"paths":[ "NOT /home/*", "/*" ]
如果这样写就是除了不支持/home下所有的链接,其他链接都支持。
这里有很多公司的apple-app-site-association文件设置
4.上传apple-app-site-association 文件
把你刚才制作好的apple-app-site-association文件交给服务器端的小伙伴,放到服务器的根目录下,还有一种说法是,iOS9.3之前是根目录下即:https://××××.mingpao.com/apple-app-site-association,iOS9.3之后是.well-known目录下即:https://××××.mingpao.com/.well-known/apple-app-site-association,小编为了安全起见两个都放了。
到此为止,Universal Links的工作已经基本完成了,下面我们可以检测一下上传apple-app-site-association 文件是否成功。苹果有一个检测的接口 苹果测试入口 ,将你的域名放入测试口,点击TestURL即可。
但是但是但是,小编把公司的域名放到苹果进行测试得到的答案是没有通过,但是却能正常的使用Universal Links了,关于原因,网上有很多说法。有些小伙伴说是因为你的APP没有上线,等上线了就会测试通过,但是小编的APP上线后测试依然不能通过。还有一些小伙伴说我们并没有对苹果开放爬虫。也就是不允许苹果爬虫你们的网站,这个是测不通的。
我们创建apple-app-site-association文件的目的是为了让iOS系统能获取这个文件,知道你的哪些是链接是Universal Links,哪些不是Universal Links。所以在你第一次安装APP时,iOS系统会去对应的路径下拿取apple-app-site-association文件,所以我们可以通过抓包来判断通不通。另外直接用Xcode debug调试APP时,iOS也会去拿取apple-app-site-association文件。
如果不通问题可能有很多:
1.域名不是https请求
2.服务器端的SSL证书有问题(伪证书或者无效证书)
3.服务器端的证书配置有问题
小编曾经在这里卡了2天就是找不到原因,结果是服务器端的证书配置有问题。
为了避免移动端的小伙伴被坑,我把服务器端SSL证书配置向导的网址给大家。https://sg.godaddy.com/zh/help/ssl-16623
5.在AppDelegate处理Universal Links
在AppDelegate里面添加下面的方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webpageURL = userActivity.webpageURL;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"××××.mingpao.com"]) {
//判断域名是自己的网站,进行我们需要的处理
}else{
[[UIApplication sharedApplication]openURL:webpageURL];
}
}
return YES;
}
当用Universal Links启动APP时就会调用上面的方法。
把我们设置好通用链接的URL放到备忘录中,长按URL会多出一条在“××××”中打开,当你点击时就会打开你的APP,并且在上面的方法中将URL传给你处理。
如果你选择在Safari中打开,上下滑动页面,你会发现仍然有一个按钮可以打开你的应用。
参考资料
苹果官方文档
http://pinwei.blog.51cto.com/5452359/1734167/
http://www.2cto.com/kf/201604/497162.html
文笔不好,望大家见谅。写的不全或者有误的地方,望大家不吝赐教。