什么是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協(xié)同處理包券,兩端都需要做一些工作。
1.創(chuàng)建并上傳關聯(lián)文件
首先炫贤,你的網站必須支持https溅固。
然后,創(chuàng)建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可以通過開發(fā)者賬號來查看,Bundle ID可以直接在工程里查看口柳。
<b>paths:</b>是一個數(shù)組類型用來指定網站路徑苹粟,并且是大小寫敏感的:
使用“*” 指定整個網站,在域名下的任何地址都可以打開App跃闹。
“/wwdc/news/”指定鏈接嵌削,以指定網站的某些部分.
還可以使用“?”匹配任何單個字符,"/foo/*/bar/201?/mypage"
創(chuàng)建好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的話顷蟀,需要將開發(fā)者中心的配置APPlication Services列表中的ASSociated Domains變成Enabled。
在項目targets->Capabilities->Associated Domains中配置App link骡技。在這里需要注意一下鸣个,有的域名為www.abc.com和abc.com,這兩個對于Universal links來說是不同的域名布朦,所以囤萤,如果你的網站是這兩個都需要做處理的話,需要將這兩個域名都放在associate domains列表下是趴。在添加時都要將
applinks:
放在域名前面涛舍。
例如:
- 不需要手動的添加
entitlements
,當添加domain之后唆途,系統(tǒng)會自動添加相應的文件到工程做盅,如果沒有的情況下缤削,只能通過手動添加。 - 在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
類型的數(shù)據,對該數(shù)據處理來跳轉相應的界面图筹。也就不再多說了帅刀。
到此整體的流程就已經處理完了。相關的內容介紹還是推薦看官方文檔远剩,寫的比較細致扣溺。
注意事項
- 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>點擊觸發(fā)</b>的Universal links霞怀。
- 用 Safari 打開目標域名,或者在其他 App 里用 SFSafariViewController, WKWebView, UIWebView 打開目標域名等曼,都可以達到效果。
那些坑
1. 跨域跳轉:餓了么遇到的一個問題
這里的問題凿蒜,就是我們將鏈接復制在備忘錄里發(fā)現(xiàn)可以拉起App禁谦,但是放在網頁里,點擊卻是沒有任何效果废封,這個幾乎就是跨域的鍋州泊。
這個應該是在iOS9.2之后出現(xiàn)的問題。假設當前網頁是abc.com/a漂洋,在這里有一個鏈接跳轉到abc.com/b,還是在同一個域名abc.com下遥皂。這時點擊力喷,系統(tǒng)將不會進行拉起App的操作,必須在不同的域名下比如abcd.com/b演训,這樣才會根據關聯(lián)文件去判斷是否要拉起app弟孟。這個時候就需要在Xcode中添加一個域名在碰到跨域問題不能拉起App時,鏈接改為其他的域名样悟。
這里也有解釋
2. 選擇性跳轉
這個也是一個坑拂募,蘋果會通過Universal links記錄用戶的行為習慣,當你通過一個Universal links成功的拉起了App窟她,這時你發(fā)現(xiàn)在status bar右上角有一個小按鈕(帶一個小箭頭)陈症。當你點擊了之后會成功的在Safari中打開,這時震糖,蘋果就認為你不需要這個Universal links拉起App录肯,此后在通過這個Universal links點擊時,都是在safari或者網頁中打開吊说,不會再拉起App论咏。這個是有辦法補救的,通過在Safari中點擊鏈接長按疏叨,在app中打開潘靖。此后通過Universal links就可以拉起App了。也就說蚤蔓,蘋果會記錄最后一次Universal links的跳轉情況來判斷是否需要拉起app卦溢。
這里感覺第一個的跨域跳轉與第二個的選擇性跳轉是很類似的,第一個在當前域名下點擊Universal links不能拉起app就相當于當前系統(tǒng)認為你這個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的測試網站可以檢測你上傳的文件是否正確。傳送門
寫的不好吐辙,如果有問題歡迎指正宣决。