什么是Universal Links?
iOS9之后,Apple推出的一種通用鏈接,能夠方便的通過https鏈接來啟動APP,通過唯一的網址,不需要特別的schema就可以鏈接一個特定的視圖到APP。
這也就設計到universal links的幾個特性:
- Unique:唯一性,不像自定義Url schemes那樣,因為他使用到了你網站的http或者https鏈接
- Secure:安全性,當用戶安裝應用時,iOS會檢測你上傳到服務器上的文件,以確保你的網站允許其代表應用打開你的應用。
- Flexible:靈活性,當沒有安裝你的app時universal links也是可以正常使用的,當點擊link時會直接在safari中打開url。
- Simple:一個url可以為app和web提供服務。
- Private:其他app可以與你的app通信,不需要知道你的應用程序是否安裝。
配置Universal links
配置Universal links需要網站與app協同處理,兩端都需要做一些工作。
1.創建并上傳關聯文件
首先,你的網站必須支持https。
然后,創建apple-app-site-association文件,注意一定是沒有.json后綴的,在未壓縮的情況下,文件大小不能超過128KB。
{
"applinks": {
"apps": [],
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc",
"paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
},
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
<b>appID:</b>是由TeamID+BundleId組成,TeamID可以通過開發者賬號來查看,Bundle ID可以直接在工程里查看。
<b>paths:</b>是一個數組類型用來指定網站路徑,并且是大小寫敏感的:
使用“*” 指定整個網站,在域名下的任何地址都可以打開App。
“/wwdc/news/”指定鏈接,以指定網站的某些部分.
還可以使用“?”匹配任何單個字符,"/foo/*/bar/201?/mypage"
創建好apple-app-site-association文件后,將其上傳到web服務器的跟目錄下或者.well-known
子目錄下。<b>文件是通過https訪問不需要有任何重定向。</b>然后你可以直接在瀏覽器中輸入domain/apple-app-site-association或者domain/.well-known/apple-app-site-association訪問你所上傳的文件。
通過Apple的測試網站可以檢測你上傳的文件是否正確。傳送門
注意:在用Nginx處理文件的MIME Type配置時,在域名下針對該文件進行處理,也就是說response的Content-Type必須設置為”application/json“。
使用Nginx處理文件的MIME Type配置,在server的某個域名下針對該文件處理
location /apple-app-site-association {
default_type application/json;
}
接下來就是在App內部配置了。
需要支持Universal links的話,需要將開發者中心的配置APPlication Services列表中的ASSociated Domains變成Enabled。
在項目targets->Capabilities->Associated Domains中配置App link。在這里需要注意一下,有的域名為www.abc.com和abc.com,這兩個對于Universal links來說是不同的域名,所以,如果你的網站是這兩個都需要做處理的話,需要將這兩個域名都放在associate domains列表下。在添加時都要將
applinks:
放在域名前面。
例如:
- 不需要手動的添加
entitlements
,當添加domain之后,系統會自動添加相應的文件到工程,如果沒有的情況下,只能通過手動添加。 - 在AppDelegate中調用方法來處理Universal links的回調。
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webUrl = userActivity.webpageURL;
if ([webUrl.host isEqualToString:@"domain"]) {
//打開對應頁面
}else{
//不能打開,使用Safari 打開
[[UIApplication sharedApplication]openURL:webUrl];
}
}
return YES;
}
這里回傳過來一個NSUserActivity
類型的數據,對該數據處理來跳轉相應的界面。也就不再多說了。
到此整體的流程就已經處理完了。相關的內容介紹還是推薦看官方文檔,寫的比較細致。
注意事項
- apple-app-site-association文件上傳一定不要有
.json
后綴,那些隱藏后綴名的需要注意。 - web server必須支持https
- 上傳文件最好在根目錄下,官方說也可以在根目錄下的
.well-known
目錄下。 - Xcode中配置Associated Domians時,一定要添加
applinks:
前綴。最多添加20-30條。 - app在<b>安裝</b>的時候會訪問
domain
獲取apple-app-site-association
文件,這個可以通過抓包來獲取。不是在打開app時訪問。 - 直接dev打包到手機上應該就可以測試,保證網絡暢通。
- 最簡單的方式檢測Universal links是否有效,將那個鏈接拷貝的備忘錄中(imessage、郵件),直接點擊鏈接會跳轉到App,或者長按,會在彈出的ActionSheet中第二個顯示
在xxx中打開
。 - 一定是從上級頁面(網頁)<b>點擊觸發</b>的Universal links。
- 用 Safari 打開目標域名,或者在其他 App 里用 SFSafariViewController, WKWebView, UIWebView 打開目標域名,都可以達到效果。
那些坑
1. 跨域跳轉:餓了么遇到的一個問題
這里的問題,就是我們將鏈接復制在備忘錄里發現可以拉起App,但是放在網頁里,點擊卻是沒有任何效果,這個幾乎就是跨域的鍋。
這個應該是在iOS9.2之后出現的問題。假設當前網頁是abc.com/a,在這里有一個鏈接跳轉到abc.com/b,還是在同一個域名abc.com下。這時點擊,系統將不會進行拉起App的操作,必須在不同的域名下比如abcd.com/b,這樣才會根據關聯文件去判斷是否要拉起app。這個時候就需要在Xcode中添加一個域名在碰到跨域問題不能拉起App時,鏈接改為其他的域名。
這里也有解釋
2. 選擇性跳轉
這個也是一個坑,蘋果會通過Universal links記錄用戶的行為習慣,當你通過一個Universal links成功的拉起了App,這時你發現在status bar右上角有一個小按鈕(帶一個小箭頭)。當你點擊了之后會成功的在Safari中打開,這時,蘋果就認為你不需要這個Universal links拉起App,此后在通過這個Universal links點擊時,都是在safari或者網頁中打開,不會再拉起App。這個是有辦法補救的,通過在Safari中點擊鏈接長按,在app中打開。此后通過Universal links就可以拉起App了。也就說,蘋果會記錄最后一次Universal links的跳轉情況來判斷是否需要拉起app。
這里感覺第一個的跨域跳轉與第二個的選擇性跳轉是很類似的,第一個在當前域名下點擊Universal links不能拉起app就相當于當前系統認為你這個universal links本身就在瀏覽器中打開的,認為不需要拉起app。
When a user taps a universal link that you handle, iOS also examines the user’s recent choices to determine whether to open your app or your website. For example, a user who has tapped a universal link to open your app can later choose to open your website in Safari by tapping a breadcrumb button in the status bar. After the user makes this choice, iOS continues to open your website in Safari until the user chooses to open your app by tapping OPEN in the Smart App Banner on the webpage.
相關網站
通過Apple的測試網站可以檢測你上傳的文件是否正確。傳送門
寫的不好,如果有問題歡迎指正。