Universal Link 介紹
Universal Link是蘋果在WWDC 2015上提出的iOS 9的新特性之一。此特性類似于深層鏈接,并能夠方便地通過打開一個Https鏈接來直接啟動您的客戶端應用(手機有安裝App)。對比起以往所使用的URL Sheme, 這種新特性在實現(xiàn)web-app的無縫鏈接時能夠提供極佳的用戶體驗。
這具體是一種怎樣的情景呢?舉個例子,你的用戶在微信里面瀏覽一個你們公司的網(wǎng)頁,而此時用戶手機也同時安裝有你們公司的App ;而universal link 能夠使的用戶在打開某個詳情頁時直接打開你的app 并到達app中相應內(nèi)容的頁面,從而實施用戶想要的操作(例如查看某條新聞,例如查看某個商品的明細)
以下分別為URL Scheme方式及Universal Link的方式呈現(xiàn)場景恢復的過程
以下為URL Scheme方式: (第一張圖是在微信中瀏覽web,下同)
下面是用Universal Link方式:
通過上述對比得知,Universal Link能夠直接從微信中打開App,比起以往的URL Scheme的方式能夠大大改善用戶體驗。
Univerasl Link的準備工作
- 擁有自己的域名,且此域名網(wǎng)站支持https
- 能夠上傳文件
apple-app-site-association到自己的域名 - 只支持iOS 9以上
注:可以使用三方服務,MobLink已經(jīng)幫您完成了上面所有的工作,免費為您提供Universal Link服務。使用MobLink提供的技術方案,無論您是否iOS9以上,都能夠助您實現(xiàn) Web與App 之間的完美交互。
集成步驟
- 開啟
Associated Domains服務
image.png
注意:有的app會區(qū)分線上包和測試包,不同賬號下的都需要設置App ID才行,前往不要忘記。
2.開啟Associated Domains服務
在xcode工程的Capabilities -> Associated Domains中添加跳轉(zhuǎn)域名,域名的格式為:
applinks:www.example.com

注意:
你的服務器必須支持SSL
Domains可以添加多個
Domains必須以applinks:開頭
3.配置apple-app-site-association文件,官方文檔如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
apps項必須對應一個空的數(shù)組
details項對應一個字典的數(shù)組,
-
appID對應項由前綴和ID兩部分組成,可以在developer中的Identifiers→AppIDs中點擊對應的App ID查看。
image.png paths對應域名中的path,用于過濾可以跳轉(zhuǎn)到App的鏈接,支持通配符
*,?以及NOT進行匹配,匹配的優(yōu)先級是從左至右依次降低。建議配置上path,同一公司可能多款app有次需求,不同的path有益于后期的擴展。
最后,需要把配置好的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/目錄下。
4.Appdelegate增加如下代碼
#pragma mark Universal Link
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
// TODO 根據(jù)需求進行處理
}
// TODO 根據(jù)需求進行處理
return YES;
}
坑
在Safari中點擊鏈接打開App后,會發(fā)現(xiàn)App的右上角的navigationBar會有一串網(wǎng)址的鏈接箭頭,
如果你點擊了它,它會跳轉(zhuǎn)到Safari,同時系統(tǒng)會默認你選擇用Safari來打開該域名的鏈接,而不用app打開,也就是說下次你再點擊該鏈接,它只會在Safari中打開,不會在App中打開了。
那么如何開啟app跳轉(zhuǎn)呢?有兩種方法:
第一種,在Safari頁面中,手指往下拉一下頁面,會顯示一個“隱藏”的banner,俗稱為 smart banner,右側(cè)有一個button,點擊它,就開啟App跳轉(zhuǎn)功能了。
第二種,長按跳轉(zhuǎn)鏈接,底下會彈出一些選項,選擇在App中打開,同樣可以開啟這個功能。
apple-app-site-association文件注意格式是否正確 中文字符不識別
總結
apple-app-site-association不需要.json后綴。
如果要對沒有path的域名進行支持(如:www.163.com),在json文件的paths中用通配符’*’是不行的,需要在paths數(shù)組中加入’/’進行匹配。
對json文件的請求僅在App第一次啟動時進行,如果此時網(wǎng)絡連接出了問題apple會緩存請求,等有網(wǎng)的時候再去請求,而實際測試抓包并沒有請求故通用連接會失效。
paths匹配的優(yōu)先級是從左至右依次降低,但需要明確,否則會出問題。比如"paths":[ "NOT /together/",""],在IOS9.2上path為/together/*都不會跳到App,但是在IOS9.0上會跳到。
iOS 9.2開始,在相同的domain內(nèi)Universal Links是不work的,必須要跨域才生效



