iOS 9
以前,一直使用的是URL Schemes
技術來從外部對App
進行跳轉,可是iOS
系統中進行URL Schemes
跳轉的時候若是沒有安裝App
,會提示Cannot open Page
的提示,並且當註冊有多個scheme
相同的時候,目前沒有辦法區分,可是從iOS 9
起可使用Universal Links
技術進行跳轉頁面,這是一種體驗更加完美的解決方案git
什麼是Universal Link
(通用連接) Universal Link
是Apple
在iOS 9
推出的一種可以方便的經過傳統HTTPS
連接來啓動APP
的功能。若是你的應用支持Universal Link
,當用戶點擊一個連接時能夠跳轉到你的網站並得到無縫重定向到對應的APP
,且不須要經過Safari
瀏覽器。若是你的應用不支持的話,則會在Safari
中打開該連接github
支持Universal Link
(通用連接) 先決條件:必須有一個支持HTTPS
的域名,而且擁有該域名下上傳到根目錄的權限(爲了上傳Apple
指定文件)web
集成步驟json
開發者中心配置 找到對應的App ID
,在Application Services
列表裏有Associated Domains
一條,把它變爲Enabled
就能夠了 api
工程配置 targets->Capabilites->Associated Domains
,在其中的Domains
中填入你想支持的域名,必須以applinks:
爲前綴,如:applinks:domain
跨域
配置指定文件 建立一個內容爲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
。登錄開發者中心,在Account -> Membership
裏面能夠找到Team ID
paths
:設定你的app
支持的路徑列表,只有這些指定路徑的連接,才能被app
所處理。*
的寫法表明了可識別域名下全部連接bash
上傳該文件 上傳該文件到你的域名所對應的根目錄
或者.well-known目錄
下,這是爲了蘋果能獲取到你上傳的文件。上傳完後,先訪問一下,看看是否可以獲取到,當你在瀏覽器中輸入這個文件連接後,應該是直接下載apple-app-site-association
文件服務器
代碼中的相關支持 當點擊某個連接,能夠直接進咱們的app
,可是咱們的目的是要可以獲取到用戶進來的連接,根據連接來展現給用戶相應的內容,咱們須要在工程裏實現AppDelegate
對應的方法:app
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
// NSUserActivityTypeBrowsingWeb 由Universal Links喚醒的APP
if ([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];
}
}
return YES;
}
複製代碼
蘋果爲了方便開發者,提供了一個網頁驗證咱們編寫的這個apple-app-site-association
是否合法有效
Universal Link
跨域 Universal Link
有跨域問題,Universal Link
必需要求跨域,若是不跨域,就不會跳轉(iOS 9.2
以後的改動) 假如當前網頁的域名是A
,當前網頁發起跳轉的域名是B
,必需要求B
和A
是不一樣域名纔會觸發Universal Link
,若是B
和A
是相同域名,只會繼續在當前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
方法能夠)