iOS 喚起APP之Universal Link(通用鏈接)
iOS 9之前,一直使用的是URL Schemes技術(shù)來從外部對App進(jìn)行跳轉(zhuǎn),但是iOS系統(tǒng)中進(jìn)行URL Schemes跳轉(zhuǎn)的時(shí)候如果沒有安裝App,會(huì)提示Cannot open Page的提示,而且當(dāng)注冊有多個(gè)scheme相同的時(shí)候,目前沒有辦法區(qū)分,但是從iOS 9起可以使用Universal Links技術(shù)進(jìn)行跳轉(zhuǎn)頁面,這是一種體驗(yàn)更加完美的解決方案
什么是Universal Link(通用鏈接)?Universal Link是Apple在iOS 9推出的一種能夠方便的通過傳統(tǒng)HTTPS鏈接來啟動(dòng)APP的功能。如果你的應(yīng)用支持Universal Link,當(dāng)用戶點(diǎn)擊一個(gè)鏈接時(shí)可以跳轉(zhuǎn)到你的網(wǎng)站并獲得無縫重定向到對應(yīng)的APP,且不需要通過Safari瀏覽器。如果你的應(yīng)用不支持的話,則會(huì)在Safari中打開該鏈接
支持Universal Link(通用鏈接) 先決條件:必須有一個(gè)支持HTTPS的域名,并且擁有該域名下上傳到根目錄的權(quán)限(為了上傳Apple指定文件)
集成步驟
開發(fā)者中心配置 找到對應(yīng)的App ID,在Application Services列表里有Associated Domains一條,把它變?yōu)镋nabled就可以了
工程配置?targets->Capabilites->Associated Domains,在其中的Domains中填入你想支持的域名,必須以applinks:為前綴,如:applinks:domain
配置指定文件 創(chuàng)建一個(gè)內(nèi)容為json格式的文件,蘋果將會(huì)在合適的時(shí)候,從我們在項(xiàng)目中填入的域名請求這個(gè)文件。這個(gè)文件名必須為apple-app-site-association,切記沒有后綴名,文件內(nèi)容大概是這樣子:
{"applinks": {"apps": [],"details": [? ? ? ? ? ? {"appID":"9JA89QQLNQ.com.apple.wwdc","paths": ["/wwdc/news/","/videos/wwdc/2015/*"]? ? ? ? ? ? },? ? ? ? ? ? {"appID":"ABCD1234.com.apple.wwdc","paths": ["*"]? ? ? ? ? ? }? ? ? ? ]? ? }}復(fù)制代碼
appID:組成方式是TeamID.BundleID。如上面的9JA89QQLNQ就是teamId。登陸開發(fā)者中心,在Account -> Membership里面可以找到Team ID?paths:設(shè)定你的app支持的路徑列表,只有這些指定路徑的鏈接,才能被app所處理。*的寫法代表了可識(shí)別域名下所有鏈接
上傳該文件 上傳該文件到你的域名所對應(yīng)的根目錄或者.well-known目錄下,這是為了蘋果能獲取到你上傳的文件。上傳完后,先訪問一下,看看是否能夠獲取到,當(dāng)你在瀏覽器中輸入這個(gè)文件鏈接后,應(yīng)該是直接下載apple-app-site-association文件
代碼中的相關(guān)支持 當(dāng)點(diǎn)擊某個(gè)鏈接,可以直接進(jìn)我們的app,但是我們的目的是要能夠獲取到用戶進(jìn)來的鏈接,根據(jù)鏈接來展示給用戶相應(yīng)的內(nèi)容,我們需要在工程里實(shí)現(xiàn)AppDelegate對應(yīng)的方法:
- (BOOL)application:(UIApplication *)applicationcontinueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {? ? // NSUserActivityTypeBrowsingWeb 由Universal Links喚醒的APPif([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]){? ? ? ? NSURL *webpageURL = userActivity.webpageURL;? ? ? ? NSString *host = webpageURL.host;if([host?isEqualToString:@"api.r2games.com.cn"]){? ? ? ? ? ? //進(jìn)行我們的處理? ? ? ? ? ? NSLog(@"TODO....");? ? ? ? }else{? ? ? ? ? ? NSLog(@"openurl");? ? ? ? ? ? [[UIApplication sharedApplication] openURL:webpageURL options:nil completionHandler:nil];? ? ? ? ? ? // [[UIApplication sharedApplication] openURL:webpageURL];? ? ? ? }? ? }returnYES;}復(fù)制代碼
蘋果為了方便開發(fā)者,提供了一個(gè)網(wǎng)頁驗(yàn)證我們編寫的這個(gè)apple-app-site-association是否合法有效
Universal Link(通用鏈接)注意點(diǎn)
Universal Link跨域?Universal Link有跨域問題,Universal Link必須要求跨域,如果不跨域,就不會(huì)跳轉(zhuǎn)(iOS 9.2之后的改動(dòng)) 假如當(dāng)前網(wǎng)頁的域名是A,當(dāng)前網(wǎng)頁發(fā)起跳轉(zhuǎn)的域名是B,必須要求B和A是不同域名才會(huì)觸發(fā)Universal Link,如果B和A是相同域名,只會(huì)繼續(xù)在當(dāng)前WebView里面進(jìn)行跳轉(zhuǎn),哪怕你的Universal Link一切正常,根本不會(huì)打開App
Universal Link請求apple-app-site-association時(shí)機(jī)
當(dāng)我們的App在設(shè)備上第一次運(yùn)行時(shí),如果支持Associated Domains功能,那么iOS會(huì)自動(dòng)去GET定義的Domain下的apple-app-site-association文件
iOS會(huì)先請求https://domain.com/.well-known/apple-app-site-association,如果此文件請求不到,再去請求https://domain.com/apple-app-site-association,所以如果想要避免服務(wù)器接收過多GET請求,可以直接把a(bǔ)pple-app-site-association放在./well-known目錄下
服務(wù)器上apple-app-site-association的更新不會(huì)讓iOS本地的apple-app-site-association同步更新,即iOS只會(huì)在App第一次啟動(dòng)時(shí)請求一次,以后除非App更新或重新安裝,否則不會(huì)在每次打開時(shí)請求apple-app-site-association
Universal Link的好處
之前的Custom URL scheme是自定義的協(xié)議,因此在沒有安裝該app的情況下是無法直接打開的。而Universal Links本身就是一個(gè)能夠指向web頁面或者app內(nèi)容頁的標(biāo)準(zhǔn)web link,因此能夠很好的兼容其他情況
Universal links是從服務(wù)器上查詢是哪個(gè)app需要被打開,因此不存在Custom URL scheme那樣名字被搶占、沖突的情況
Universal links支持從其他app中的UIWebView中跳轉(zhuǎn)到目標(biāo)app
提供Universal link給別的app進(jìn)行app間的交流時(shí),對方并不能夠用這個(gè)方法去檢測你的app是否被安裝(之前的custom scheme URL的canOpenURL方法可以)
僅做筆記 ~