背景
在iOS 9以前获印,我們從外部啟動(dòng)App都是通過(guò)URL Scheme實(shí)現(xiàn)跳轉(zhuǎn)的述雾。這種方式雖然可自定程度很高,能夠巧妙地實(shí)現(xiàn)很多跳轉(zhuǎn)兼丰,但弊端也很明顯:我們只能通過(guò)scheme://example這種格式的鏈接來(lái)實(shí)現(xiàn)跳轉(zhuǎn)玻孟,而且現(xiàn)在蘋(píng)果還對(duì)這種方式的跳轉(zhuǎn)加了一個(gè)提示框:“是否打開(kāi)XXX”。對(duì)于對(duì)Web和原生App交互的場(chǎng)景需求量很大的產(chǎn)品來(lái)說(shuō)鳍征,這樣的跳轉(zhuǎn)方式顯然是步驟冗雜的黍翎,用戶體驗(yàn)并不好。
iOS 9以后艳丛,Universal Link的出現(xiàn)解決了這個(gè)問(wèn)題匣掸。它所提供的直接趟紊、順暢、無(wú)縫銜接的跳轉(zhuǎn)能夠讓用戶體驗(yàn)提升一個(gè)級(jí)別碰酝。用戶可以點(diǎn)擊開(kāi)發(fā)者指定的類似于https://example.com/t
的URL直接喚醒App霎匈,而不需要在瀏覽器打開(kāi)再點(diǎn)擊其他按鈕。
在你的App中添加這個(gè)功能很簡(jiǎn)單:
- 在蘋(píng)果開(kāi)發(fā)者網(wǎng)站中打開(kāi)需要使用Universal Link功能的App中的Associated Domains
- 上傳apple-app-site-association到服務(wù)器根目錄下
- 在AppDelegate中實(shí)現(xiàn)相應(yīng)的方法
配置
首先送爸,我們要在蘋(píng)果開(kāi)發(fā)者網(wǎng)站中開(kāi)啟App的Associated Domains功能铛嘱。
在Account -> Certificates, Identifiers & Profiles -> App IDs -> YourApp -> Edit中把Associated Domains設(shè)置為Enable
然后我們需要配置一下工程文件,找到Capabilities -> Associated Domains
打開(kāi)此功能并把你需要跳轉(zhuǎn)的domain加進(jìn)去袭厂,格式為applinks:www.example.com
部署
注意
首先你的服務(wù)器必須得支持SSL
接下來(lái)弄痹,我們需要上傳一個(gè)json文件到我們的服務(wù)器。json文件以apple-app-site-association命名
注意
文件不需要添加任何后綴
json的格式是這樣的:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TeamID.com.domain.App",
"paths":[ "*" ]
}
]
}
}
appID
:TeamID加上Bundle IDpaths
:支持Universal Link嵌器,也就是可以跳轉(zhuǎn)的路徑肛真。*
代表此域名下所有路徑都支持,也可以具體制定到某個(gè)頁(yè)面例如/path/page
或者某個(gè)路徑下所有URL例如/path/*
關(guān)于paths
的配置爽航,可以參考蘋(píng)果官方文檔
- Use * to specify your entire website
- Include a specific URL, such as /wwdc/news/, to specify a particular link
- Append * to a specific URL, such as /videos/wwdc/2015/*, to specify a section of your website
- In addition to using * to match any substring, you can also use ? to match any single character. You can combine both wildcards in a single path, such as /foo/*/bar/201?/mypage.
最后蚓让,我們只需要把配置好的json文件上傳到服務(wù)器中該域名的根目錄下,言下之意讥珍,我們可以用GET請(qǐng)求可以獲取到https://www.example.com/apple-app-association
再次強(qiáng)調(diào)必須是HTTPS協(xié)議
當(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)求,可以直接把apple-app-site-association
放在./well-known/
目錄下
注意
服務(wù)器上
apple-app-site-association
的更新不會(huì)讓iOS本地的apple-app-site-association
同步更新氏义,即iOS只會(huì)在App第一次啟動(dòng)時(shí)請(qǐng)求一次锄列,以后除非App更新或重新安裝否則不會(huì)在每次打開(kāi)時(shí)請(qǐng)求apple-app-site-association
開(kāi)發(fā)
待我們服務(wù)器部署好了,用curl測(cè)試一下apple-app-site-association
能夠正確GET到了,那么我們就需要在工程中響應(yīng)跳轉(zhuǎn)事件了惯悠。
我們?cè)贏ppDelegate中實(shí)現(xiàn)如下代理方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
具體實(shí)現(xiàn):
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
return YES;
}
//讀取url地址
NSURL *webUrl = userActivity.webpageURL;
if (![webUrl.path isEqualToString:@"/show"]) {
//path錯(cuò)誤邻邮,直接從safari打開(kāi)
[[UIApplication sharedApplication] openURL:webUrl];
return YES;
}
//跳轉(zhuǎn)并顯示內(nèi)容
[[NSNotificationCenter defaultCenter] postNotificationName:@"notify" object:@"hello world"];
return YES;
}
這里的自由度就很高了,我們可以根據(jù)傳入的任何符合跳轉(zhuǎn)條件的URL進(jìn)行不同的操作克婶。
測(cè)試
現(xiàn)在一切都已經(jīng)完成了筒严,現(xiàn)在我們可以在短信中點(diǎn)擊一個(gè)URL直接跳轉(zhuǎn)到我們的App。至于如何檢驗(yàn)URL是否能夠跳轉(zhuǎn)情萤,一個(gè)快捷方便的方法就是在系統(tǒng)原生App中(如短信鸭蛙、郵件等)長(zhǎng)按URL,如果彈出的選項(xiàng)中有在“your app”中打開(kāi)筋岛,那么證明該URL是支持跳轉(zhuǎn)的娶视。
注意
非系統(tǒng)原生App不一定能支持直接點(diǎn)擊URL跳轉(zhuǎn),例如在微信中點(diǎn)擊URL會(huì)首先在微信內(nèi)的WebView打開(kāi)泉蝌,如果要跳轉(zhuǎn)只能再通過(guò)Safari打開(kāi)歇万。