iOS 9
之前宵呛,一直使用的是URL Schemes
技術來從外部對App
進行跳轉遍愿,但是iOS
系統(tǒng)中進行URL Schemes
跳轉的時候如果沒有安裝App
,會提示Cannot open Page
的提示净嘀,而且當注冊有多個scheme
相同的時候狂魔,目前沒有辦法區(qū)分,但是從iOS 9
起可以使用Universal Links
技術進行跳轉頁面凌彬,這是一種體驗更加完美的解決方案
什么是
Universal Link
(通用鏈接)
Universal Link
是Apple
在iOS 9
推出的一種能夠方便的通過傳統(tǒng)HTTPS
鏈接來啟動APP
的功能沸柔。如果你的應用支持Universal Link
,當用戶點擊一個鏈接時可以跳轉到你的網(wǎng)站并獲得無縫重定向到對應的APP
铲敛,且不需要通過Safari
瀏覽器褐澎。如果你的應用不支持的話,則會在Safari
中打開該鏈接支持
Universal Link
(通用鏈接)
先決條件:必須有一個支持HTTPS
的域名伐蒋,并且擁有該域名下上傳到根目錄的權限(為了上傳Apple
指定文件)集成步驟
-
開發(fā)者中心配置
找到對應的App ID
工三,在Application Services
列表里有Associated Domains
一條,把它變?yōu)?code>Enabled就可以了
-
工程配置
targets->Capabilites->Associated Domains
先鱼,在其中的Domains
中填入你想支持的域名俭正,必須以applinks:
為前綴,如:applinks:domain
配置指定文件
創(chuàng)建一個內(nèi)容為json
格式的文件焙畔,蘋果將會在合適的時候掸读,從我們在項目中填入的域名請求這個文件。這個文件名必須為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": [ "*" ]
}
]
}
}
appID
:組成方式是TeamID.BundleID
抑淫。如上面的9JA89QQLNQ
就是teamId
。登陸開發(fā)者中心姥闪,在Account -> Membership
里面可以找到Team ID
paths
:設定你的app
支持的路徑列表始苇,只有這些指定路徑的鏈接,才能被app
所處理筐喳。*
的寫法代表了可識別域名下所有鏈接
- 注意:蘋果是根據(jù)域名下的
paths
處理要打開的應用的催式,所以要避免相同的paths
對應多個appID
上傳該文件
上傳該文件到你的域名所對應的根目錄
或者.well-known目錄
下,這是為了蘋果能獲取到你上傳的文件避归。上傳完后荣月,先訪問一下,看看是否能夠獲取到梳毙,當你在瀏覽器中輸入這個文件鏈接后哺窄,應該是直接下載apple-app-site-association
文件代碼中的相關支持
當點擊某個鏈接,可以直接進我們的app
账锹,但是我們的目的是要能夠獲取到用戶進來的鏈接萌业,根據(jù)鏈接來展示給用戶相應的內(nèi)容,我們需要在工程里實現(xiàn)AppDelegate
對應的方法:
- (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;
}
蘋果為了方便開發(fā)者奸柬,提供了一個網(wǎng)頁驗證我們編寫的這個apple-app-site-association
是否合法有效生年,但是蘋果官方給的檢測接口不靠譜,可以把通用鏈接地址在瀏覽器或者記事本上填寫訪問廓奕,能拉起應用就是配置成功了抱婉,不能就說明配置有問題或者還沒有生效,一般配置完成最快要30分鐘后
才能生效
三方工具:校驗AASA文件有效性
注意如果掛了代理桌粉,SSL的設置一定不要監(jiān)控蘋果的這個
https://app-site-association.cdn-apple.com
域名蒸绩,可能會導致訪問通用鏈接無效Universal Link(通用鏈接)注意點
-
Universal Link
跨域
Universal Link
有跨域問題,Universal Link
必須要求跨域铃肯,如果不跨域侵贵,就不會跳轉(iOS 9.2
之后的改動)要求具備跨域能力即可
假如當前網(wǎng)頁的域名是A
,當前網(wǎng)頁發(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
是自定義的協(xié)議,因此在沒有安裝該app
的情況下是無法直接打開的拷肌。而Universal Links
本身就是一個能夠指向web
頁面或者app
內(nèi)容頁的標準web link
到旦,因此能夠很好的兼容其他情況 -
Universal links
是從服務器上查詢是哪個app
需要被打開,因此不存在Custom URL scheme
那樣名字被搶占巨缘、沖突的情況 -
Universal links
支持從其他app
中的UIWebView
中跳轉到目標app
- 提供
Universal link
給別的app
進行app
間的交流時添忘,對方并不能夠用這個方法去檢測你的app
是否被安裝(之前的custom scheme URL
的canOpenURL
方法可以)