一、 通用鏈接介紹
Apple 推出通用鏈接:一種能夠方便的通過傳統(tǒng) HTTP 鏈接來啟動 APP, 使用相同的網(wǎng)址打開網(wǎng)站和 APP。
當(dāng)你的應(yīng)用支持通用鏈接,iOS9 之后 , 用戶可以點擊一個鏈接跳轉(zhuǎn)到你的網(wǎng)站,并獲得無縫重定向到您安裝的應(yīng)用程序,而無需通過 Safari 瀏覽器。如果你的應(yīng)用不支持的話,點擊鏈接將會用 Safari 來打開。
二、 通用鏈接的關(guān)鍵實現(xiàn)條件
有一個注冊的域名
域名可通過 SSL 訪問(應(yīng)該是需要有效的證書)
支持上傳一個 JSON 文件到域名
iOS 9? 以上版本
Xcode 7 以上
需要真機測試,模擬器不支持通用鏈接
web server 需要支持 https,客戶端需要通告 https 訪問,并且不支持任何重定向
說了這么多是時候來點干貨了;
三、 通用鏈接實現(xiàn)步驟
1.在項目中開啟Associated Domains 域
? 進入自己的項目的Targets->Capabilites->Associated Domains,設(shè)置成ON狀態(tài),這時候你會發(fā)現(xiàn)你的項目的文件夾下會多出一個.entitlements的文件

注意:我這里是使用了Xcode的自動管理證書,所以當(dāng)我打開Associated Domains時Xcode會自動幫我處理證書配置問題以及appIDs打開Associated Domains。
如果你是使用手動管理證書,需在處理第1步之前先去自己的開發(fā)者賬號找到對應(yīng)的appIDs,勾選Associated Domains選項。具體操作步驟:
進入蘋果Apple Developer -> Member Center -> Certificates, Identifiers & Profiles – >Identifiers - >App IDs–>Edit 然后開啟打鉤 Associated Domains 后保存。

如果證書設(shè)置正確以及App IDs的Associated Domains打開后,你再執(zhí)行第1步操作之后Associated Domains下面的steps有2個對號,否則就會出現(xiàn)錯號。

2.在Associated Domains下添加web端的域名
點擊Associated Domains的+號填入applinks:后面是你的域名,例如我公司的是
applinks:×××××.mingpao.com

3 制作apple-app-site-association 文件
創(chuàng)建一個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 是一個字符串的數(shù)組,這里是你的應(yīng)用支持的通用鏈接與不支持的鏈接,這里小編使用的是/*,代表著只要是Associated Domains域名下的所有的鏈接都支持。如果你不支持某一個鏈接,在這個鏈接前面加NOT空格,舉個例子
"paths":[? "NOT /home/*",? "/*"? ]
如果這樣寫就是除了不支持/home下所有的鏈接,其他鏈接都支持。
這里有很多公司的apple-app-site-association文件設(shè)置?
4.上傳apple-app-site-association 文件
把你剛才制作好的apple-app-site-association文件交給服務(wù)器端的小伙伴,放到服務(wù)器的根目錄下,還有一種說法是,iOS9.3之前是根目錄下即:https://××××.mingpao.com/apple-app-site-association,iOS9.3之后是.well-known目錄下即:https://××××.mingpao.com/.well-known/apple-app-site-association,小編為了安全起見兩個都放了。

到此為止,Universal Links的工作已經(jīng)基本完成了,下面我們可以檢測一下上傳apple-app-site-association 文件是否成功。蘋果有一個檢測的接口 蘋果測試入口 ,將你的域名放入測試口,點擊TestURL即可。

但是但是但是,小編把公司的域名放到蘋果進行測試得到的答案是沒有通過,但是卻能正常的使用Universal Links了,關(guān)于原因,網(wǎng)上有很多說法。有些小伙伴說是因為你的APP沒有上線,等上線了就會測試通過,但是小編的APP上線后測試依然不能通過。還有一些小伙伴說我們并沒有對蘋果開放爬蟲。也就是不允許蘋果爬蟲你們的網(wǎng)站,這個是測不通的。
我們創(chuàng)建apple-app-site-association文件的目的是為了讓iOS系統(tǒng)能獲取這個文件,知道你的哪些是鏈接是Universal Links,哪些不是Universal Links。所以在你第一次安裝APP時,iOS系統(tǒng)會去對應(yīng)的路徑下拿取apple-app-site-association文件,所以我們可以通過抓包來判斷通不通。另外直接用Xcode debug調(diào)試APP時,iOS也會去拿取apple-app-site-association文件。
如果不通問題可能有很多:
1.域名不是https請求
2.服務(wù)器端的SSL證書有問題(偽證書或者無效證書)
3.服務(wù)器端的證書配置有問題
小編曾經(jīng)在這里卡了2天就是找不到原因,結(jié)果是服務(wù)器端的證書配置有問題。

為了避免移動端的小伙伴被坑,我把服務(wù)器端SSL證書配置向?qū)У木W(wǎng)址給大家。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"]) {
//判斷域名是自己的網(wǎng)站,進行我們需要的處理
}else{
[[UIApplication sharedApplication]openURL:webpageURL];
}
}
return YES;
}
當(dāng)用Universal Links啟動APP時就會調(diào)用上面的方法。
把我們設(shè)置好通用鏈接的URL放到備忘錄中,長按URL會多出一條在“××××”中打開,當(dāng)你點擊時就會打開你的APP,并且在上面的方法中將URL傳給你處理。

如果你選擇在Safari中打開,上下滑動頁面,你會發(fā)現(xiàn)仍然有一個按鈕可以打開你的應(yīng)用。

參考資料
http://pinwei.blog.51cto.com/5452359/1734167/
http://www.2cto.com/kf/201604/497162.html?
文筆不好,望大家見諒。寫的不全或者有誤的地方,望大家不吝賜教。