iOS Universal Links(通用链接)的使用

96
liangZhen
0.5 2017.01.05 15:29* 字数 1664

一、 通用链接介绍

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 

文笔不好,望大家见谅。写的不全或者有误的地方,望大家不吝赐教。

iOS技术