簡介
Universal Links 是蘋果在2015年WWDC上推出的一項新功能,官方功能描述如下:
In iOS 9 and later, universal links let users open your app when they tap links to your website within WKWebView and UIWebView views and Safari pages, in addition to links that result in a call to openURL:, such as those that occur in Mail, Messages, and other apps.
簡單來說即當(dāng)用戶在 WKWebView、UIWebView 或者 Safari 中點擊一個鏈接,如果設(shè)備上安裝了適配該鏈接的 app,就可以跳轉(zhuǎn)該 app 對應(yīng)的頁面碗啄,否則仍然展示網(wǎng)頁 。由于目前微信內(nèi)置瀏覽器仍然不支持 openURL 的方式進(jìn)行應(yīng)用間的跳轉(zhuǎn),不少 app 產(chǎn)品通過接入 Universal Links 實現(xiàn)微信瀏覽器一鍵跳轉(zhuǎn)到自己app的功能米苹。
效果
在“取暖” app 中接入 Universal Links ,微信中打開分享的話題砰琢,點擊底部“打開App”按鈕蘸嘶,直接跳轉(zhuǎn)到“取暖”對應(yīng)的話題詳情頁面:
流程
1.創(chuàng)建一個包含 JSON 數(shù)據(jù)的 apple-app-site-association 文件,內(nèi)容格式如下:
? appID:app Prefix + Bundle ID, 其中 app Prefix 可以從蘋果開發(fā)賬號頁面"Certificates, Identifiers & Profiles" - "Identifiers" - "App IDs" 下找到對應(yīng) App IDs 查看陪汽,Bundle ID 可以在項目的 target -- General 中找到训唱;
? paths :設(shè)定你的 app 支持的路徑列表,只有這些指定的路徑的鏈接,才能被 app 所處理。其中 "*" 表示任意路徑(可接于指定路徑后面挚冤,表示該指定路徑下的所有子路徑)况增,"?" 表示替換路徑中的一個字符。
Use * to specify your entire website
Include a specific URL, such as /wwdc/news/, to specify a particular link
Append * to a specific URL, such as /videos/wwdc/2015/*, to specify a section of your website
In addition to using * to match any substring, you can also use ? to match any single character. You can combine both wildcards in a single path, such as /foo/*/bar/201?/mypage.
注意點:
1> 正常情況下app Prefix 和開發(fā)者賬號頁面"Membership" - "Membership information" 中的Team ID是相同的训挡,但是對于一些年代比較久遠(yuǎn)的app澳骤,這兩個值可能會不同歧强,此時應(yīng)該選擇app Prefix;
2> paths 大小寫敏感为肮;
3> "?" 表示替換一個字符誊锭,但是類似"#"這種特殊字符不可以被替換,例如paths中填寫 "/foo/*/bar/201?/mypage"弥锄,如果實際域名中路徑為 "/foo/abc/bar/201#/mypage"丧靡,則無法實現(xiàn)跳轉(zhuǎn);
4> apple-app-site-association 文件的內(nèi)容是JSON格式籽暇,其本身并沒有任何后綴名温治;
2.將 apple-app-site-association 文件上傳到服務(wù)器的 ".well-known" 或者根目錄下(親測兩個目錄均能生效)。
3. 在 Xcode - TARGETS - Capabilities 中打開 "Associated Domains" 開關(guān)戒悠,在Domains中添加需要進(jìn)行跳轉(zhuǎn)的域名(所有適配的域名前面都需要加上 "applinks:" 才能生效)熬荆;
完成步驟2和3,可通過蘋果官方提供的網(wǎng)址進(jìn)行驗證是否生效绸狐,如果域名配置成功卤恳、apple-app-site-association 文件上傳成功且格式正確,則 "Link to Application" 狀態(tài)為 "PASSED".
實際適配過程中寒矿,會出現(xiàn)文件正常上傳突琳,瀏覽器中訪問地址也可以正常下載 apple-app-site-association 文件,但是通過上述網(wǎng)站進(jìn)行驗證顯示狀態(tài)不通過的情況符相。這時也可以通過在備忘錄中添加記事本或短信中輸入App能識別的鏈接拆融,如果直接點擊此鏈接能直接跳轉(zhuǎn)到你的app,或是長按鏈接文字,在出現(xiàn)的彈出菜單中第二項是“在'XXX'中打開”啊终,也代表配置成功镜豹。
4. 在項目的 AppDelegate 里實現(xiàn)回調(diào)方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler
{
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webpageURL = userActivity.webpageURL;
NSString *host = webpageURL.host;
if ([host isEqualToString:@"xxxx.com"]) { // "xxxx.com"為步驟3中配置的域名
// 解析路徑、跳轉(zhuǎn)到指定界面 and so on...
}
else {
[[UIApplication sharedApplication]openURL:webpageURL];
}
}
return YES;
}```
當(dāng) userActivity 類型為 NSUserActivityTypeBrowsingWeb , 表明它是由Universal Links捕獲進(jìn)來蓝牲,即可以添加解析路徑趟脂、跳轉(zhuǎn)到指定界面等具體操作。
# 補(bǔ)充
需要特別注意一點:必須跨域才能支持 Universal Links 例衍!
>When a user is browsing your website in Safari and they tap a universal link to a URL in the same domain as the current webpage, iOS respects the user’s most likely intent and opens the link in Safari. If the user taps a universal link to a URL in a different domain, iOS opens the link in your app.
舉例假設(shè)當(dāng)前微信瀏覽器中話題詳情頁面的 URL 為 "www.baidu.com/XXX/YYY"昔期,底部“打開App”按鈕對應(yīng)的鏈接URL為 "www.baidu.com/AAA/BBB",雖然通過上述4步配置了 "www.baidu.com/AAA/BBB" 路徑肄渗,但由于兩者都在百度的域名下镇眷,因此實際不能完成跳轉(zhuǎn)。
通過以上4步及跨域支持翎嫡,即可實現(xiàn)一鍵從微信跳轉(zhuǎn)到app的功能欠动,但是細(xì)心的讀者可能會發(fā)現(xiàn),從微信跳轉(zhuǎn)到app的時候,屏幕右上角還有個 "warmup.cc" 的小箭頭:
![右上角跳轉(zhuǎn)箭頭](http://upload-images.jianshu.io/upload_images/716949-5fdb94194ba43dc4.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
點擊該箭頭具伍,會在Safari中打開該頁面翅雏。此時再回到微信瀏覽器中點擊 "打開App"按鈕,神奇的事情出現(xiàn)了:無法跳轉(zhuǎn)到appH搜俊M浮!
解決方案:在Safari中打開該頁面萤厅,將網(wǎng)頁拉倒最頂部橄抹,會出現(xiàn)一個懸浮框,點擊懸浮框中的打開按鈕惕味,又跳回到app中打開指定頁面楼誓,此時再回到微信瀏覽器中點擊 "打開App"按鈕,又能正常跳轉(zhuǎn)到app了名挥。
![Safari中的橫條](http://upload-images.jianshu.io/upload_images/716949-112d6b0ee9dca183.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
分析:Universal Links 功能的接入其實相當(dāng)于給某些 URL 添加了一種新的打開方式疟羹,但是舊的通過瀏覽器打開 URL 的方式仍然可用,當(dāng)點擊右上角跳轉(zhuǎn)箭頭時禀倔,相當(dāng)于又設(shè)置這些特定 URL 的默認(rèn)打開方式為瀏覽器而非 web榄融,因此一鍵跳轉(zhuǎn)功能此時會失效。反之通過點擊頂部 "打開" 按鈕救湖,相當(dāng)于又將這些特定 URL 的默認(rèn)打開方式修改為 app 愧杯,一鍵跳轉(zhuǎn)功能恢復(fù)正常。
ps:在Safari中打開頁面剛進(jìn)入時捎谨,橫條是隱藏的民效,一定要將頁面拉到最頂部時才能顯示憔维。之前曾考慮通過修改頁面布局讓其默認(rèn)顯示涛救,但是由于其并不是網(wǎng)頁內(nèi)部元素,以失敗告終 T^T .