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

注意:
你的服務(wù)器必須支持SSL
Domains可以添加多個(gè)
Domains必須以applinks:開(kāi)頭
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項(xiàng)必須對(duì)應(yīng)一個(gè)空的數(shù)組
details項(xiàng)對(duì)應(yīng)一個(gè)字典的數(shù)組,
-
appID對(duì)應(yīng)項(xiàng)由前綴和ID兩部分組成,可以在developer中的Identifiers→AppIDs中點(diǎn)擊對(duì)應(yīng)的App ID查看。
image.png paths對(duì)應(yīng)域名中的path,用于過(guò)濾可以跳轉(zhuǎn)到App的鏈接,支持通配符
*,?以及NOT進(jìn)行匹配,匹配的優(yōu)先級(jí)是從左至右依次降低。建議配置上path,同一公司可能多款app有次需求,不同的path有益于后期的擴(kuò)展。
最后,需要把配置好的json文件上傳到服務(wù)器中該域名的根目錄下,也就是說(shuō),我們可以用GET請(qǐng)求可以獲取到這個(gè)apple-app-association文件。
當(dāng)我們的App在設(shè)備上第一次運(yùn)行時(shí),如果支持Associated Domains功能,那么iOS會(huì)自動(dòng)去GET定義的Domain下的apple-app-site-association文件。
需要留意iOS會(huì)先請(qǐng)求 https://domain.com/.well-known/apple-app-site-association
如果此文件請(qǐng)求不到,再去請(qǐng)求 https://domain.com/apple-app-site-association。 所以如果想要避免服務(wù)器接收過(guò)多GET請(qǐng)求,可以直接把a(bǔ)pple-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ù)需求進(jìn)行處理
}
// TODO 根據(jù)需求進(jìn)行處理
return YES;
}
坑
在Safari中點(diǎn)擊鏈接打開(kāi)App后,會(huì)發(fā)現(xiàn)App的右上角的navigationBar會(huì)有一串網(wǎng)址的鏈接箭頭,
如果你點(diǎn)擊了它,它會(huì)跳轉(zhuǎn)到Safari,同時(shí)系統(tǒng)會(huì)默認(rèn)你選擇用Safari來(lái)打開(kāi)該域名的鏈接,而不用app打開(kāi),也就是說(shuō)下次你再點(diǎn)擊該鏈接,它只會(huì)在Safari中打開(kāi),不會(huì)在App中打開(kāi)了。
那么如何開(kāi)啟app跳轉(zhuǎn)呢?有兩種方法:
第一種,在Safari頁(yè)面中,手指往下拉一下頁(yè)面,會(huì)顯示一個(gè)“隱藏”的banner,俗稱(chēng)為 smart banner,右側(cè)有一個(gè)button,點(diǎn)擊它,就開(kāi)啟App跳轉(zhuǎn)功能了。
第二種,長(zhǎng)按跳轉(zhuǎn)鏈接,底下會(huì)彈出一些選項(xiàng),選擇在App中打開(kāi),同樣可以開(kāi)啟這個(gè)功能。
apple-app-site-association文件注意格式是否正確 中文字符不識(shí)別
總結(jié)
apple-app-site-association不需要.json后綴。
如果要對(duì)沒(méi)有path的域名進(jìn)行支持(如:www.163.com),在json文件的paths中用通配符’*’是不行的,需要在paths數(shù)組中加入’/’進(jìn)行匹配。
對(duì)json文件的請(qǐng)求僅在App第一次啟動(dòng)時(shí)進(jìn)行,如果此時(shí)網(wǎng)絡(luò)連接出了問(wèn)題apple會(huì)緩存請(qǐng)求,等有網(wǎng)的時(shí)候再去請(qǐng)求,而實(shí)際測(cè)試抓包并沒(méi)有請(qǐng)求故通用連接會(huì)失效。
paths匹配的優(yōu)先級(jí)是從左至右依次降低,但需要明確,否則會(huì)出問(wèn)題。比如"paths":[ "NOT /together/",""],在IOS9.2上path為/together/*都不會(huì)跳到App,但是在IOS9.0上會(huì)跳到。
iOS 9.2開(kāi)始,在相同的domain內(nèi)Universal Links是不work的,必須要跨域才生效



