一,簡介
通用鏈接是Apple在WWDC2015上為iOS9引入的一個新功能谢床,是通過傳統(tǒng)HTTP鏈接來啟動App的技術性含≈拚裕可以使用相同的網(wǎng)址打開網(wǎng)站和App。通過唯一的網(wǎng)址,就可以鏈接到App中具體的視圖板鬓,不需要特殊的schema悲敷。如果用戶沒有安裝App則鏈接到對應的普通網(wǎng)頁。
二俭令,對比URL Scheme跳轉(zhuǎn)
在iOS 9之前后德,我們從外部啟動App都是通過URL scheme的方式進行跳轉(zhuǎn),開發(fā)者通過配置info.plist文件中的 URL Types 可以輕松實現(xiàn)跳轉(zhuǎn)抄腔,而且現(xiàn)在蘋果還對這種跳轉(zhuǎn)的方式加了一個提示框:“是否打開XXX”瓢湃,跳轉(zhuǎn)過程也顯得不流暢。
而UniversalLink跳轉(zhuǎn)方式可以實現(xiàn)無縫跳轉(zhuǎn)赫蛇,當瀏覽器識別到預先指定好的URL绵患,就可以直接喚醒App,不需要在瀏覽器中打開再去點擊其他按鈕悟耘。
三落蝙,開發(fā)步驟
1,打開Associated Domains服務
登錄開發(fā)者賬號暂幼,在Identifiers下AppIDs找到自己的App ID筏勒,編輯打開Associated Domains服務。
2,在Xcode中開啟Associated Domains服務
找到工程的Capabilities -> Associated Domains旺嬉,打開此功能管行,在Domains中添加跳轉(zhuǎn)域名,域名的格式為:
applinks:www.example.com
注:
①邪媳,你的服務器必須支持SSL捐顷;
②,Domains可以添加多個雨效;
③迅涮,Domains必須以 applinks: 開頭;
3徽龟,配置 apple-app-site-association 文件
蘋果官方給出的格式如下圖所示:
其中apps項必須對應一個空的數(shù)組逗柴,details項對應一個字典的數(shù)組,其中appID對應項由前綴和ID兩部分組成顿肺,可以在developer.apple.com中的Identifiers→AppIDs中點擊對應的App ID查看戏溺。
paths對應域名中的path,用于過濾可以跳轉(zhuǎn)到App的鏈接屠尊,支持通配符‘*’旷祸,‘?’以及‘NOT’進行匹配讼昆,匹配的優(yōu)先級是從左至右依次降低托享。
最后,需要把配置好的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/目錄下。
Tips
服務器上apple-app-site-association的更新不會讓iOS本地的apple-app-site-association同步更新迄沫,即iOS只會在App第一次啟動時請求一次稻扬,以后除非App更新或重新安裝否則不會在每次打開時請求apple-app-site-association。
4羊瘩,Xcode代碼處理
當服務器部署完成之后泰佳,我們需要在AppDelegate中實現(xiàn)代理方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
具體實現(xiàn)如下:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
return YES;
}
//讀取url地址
NSURL *jumpUrl = userActivity.webpageURL;
// TODO: handle jump code
return YES;
}
5,測試過程
最簡單的測試方法尘吗,是在系統(tǒng)的短信中點擊一個URL直接跳轉(zhuǎn)到App逝她,點擊之前定義的鏈接,如果能跳轉(zhuǎn)到App內(nèi)摇予,就正明配置成功了汽绢。
四吗跋,挖坑提示
1侧戴,在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中打開潮太,同樣可以開啟這個功能。
2蒜胖,apple-app-site-association 文件注意格式是否正確消别,json格式中的引號是全角還是半角的。(特別注意一下這個問題台谢,如果是中文的引號寻狂,點擊鏈接不會跳轉(zhuǎn)到App)
五,總結(jié)
1朋沮,apple-app-site-association不需要.json后綴蛇券。
2,如果要對沒有path的域名進行支持(如:www.163.com)樊拓,在json文件的paths中用通配符’*’是不行的纠亚,需要在paths數(shù)組中加入’/’進行匹配。
3筋夏,對json文件的請求僅在App第一次啟動時進行蒂胞,如果此時網(wǎng)絡連接出了問題apple會緩存請求,等有網(wǎng)的時候再去請求条篷,而實際測試抓包并沒有請求故通用連接會失效骗随。
4,paths匹配的優(yōu)先級是從左至右依次降低赴叹,但需要明確鸿染,否則會出問題。比如"paths":[ "NOT /together/",""]乞巧,在IOS9.2上path為/together/*都不會跳到App涨椒,但是在IOS9.0上會跳到。
5绽媒,從iOS 9.2開始蚕冬,在相同的domain內(nèi)Universal Links是不work的,必須要跨域才生效