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