本文內(nèi)容收集整理自網(wǎng)絡(luò)粪牲,結(jié)合了項(xiàng)目中的情況
1.什么是Universal Link
iOS9 新引入的一個(gè)功能憎账,是通過傳統(tǒng)HTTP鏈接來啟動(dòng)App的技術(shù)蚤假,可以使用相同的網(wǎng)址打開網(wǎng)站和App击费。通過唯一的網(wǎng)址逞刷,就可以鏈接到App中具體的視圖风罩,不需要特殊的scheme荞下。如果用戶沒有安裝App則鏈接到對(duì)應(yīng)的普通網(wǎng)頁拧篮。無縫連接Web-App ,備忘錄-App,信息-App之間的跳轉(zhuǎn)。
(在iOS 9以前螺垢,我們從外部啟動(dòng)App都是通過URL Scheme實(shí)現(xiàn)跳轉(zhuǎn)的喧务,與scheme不同,Universal Link是系統(tǒng)級(jí)別的枉圃,可以突破微信或是其他第三方封殺功茴;
無縫跳轉(zhuǎn),沒有提示框彈出孽亲,沒有安裝App則鏈接到對(duì)應(yīng)的普通網(wǎng)頁痊土,讓用戶體驗(yàn)提升一個(gè)級(jí)別)
特征
唯一性。不像自定義的scheme協(xié)議墨林, unversal link不受其他App的限制赁酝,因?yàn)樗鞘褂脴?biāo)準(zhǔn)的http和https協(xié)議連接到自己的網(wǎng)站。
安全性旭等。當(dāng)用戶安裝你的app的時(shí)候酌呆,iOS系統(tǒng)會(huì)檢測(cè)你指定服務(wù)器你來確定你的網(wǎng)站是否支持通過這個(gè)方式來打開URL鏈接。一旦你創(chuàng)建和上傳你的關(guān)聯(lián)文件到你的服務(wù)器搔耕,你的站點(diǎn)和app的關(guān)聯(lián)就是私密安全的隙袁。
靈活性。Universal Link無論是是否安裝了關(guān)聯(lián)的app弃榨,都可以無縫的工作菩收。當(dāng)用戶未安裝關(guān)聯(lián)的app時(shí),就是一個(gè)普通的URL鏈接鲸睛,可以通過webView正常打開娜饵,無需做其他配置。這個(gè)完全是iOS系統(tǒng)webKit的行為官辈,開發(fā)者不用關(guān)心箱舞。
簡(jiǎn)單。一個(gè)URL鏈接,可以同時(shí)作用于網(wǎng)站和app拳亿。
私密性晴股。其他app可以無縫的和你的app通信,其他app并不能通過連接知道用戶是不是安裝了你的app肺魁。
先決條件
- 有一個(gè)注冊(cè)的域名电湘,并可通過 SSL 訪問
- 至少 iOS 9 版本
- 至少 Xcode 7
Universal Link的基本運(yùn)作流程
- APP第一次啟動(dòng) or APP更新版本后第一次啟動(dòng)
- APP向工程里配置的域名發(fā)起Get請(qǐng)求拉取apple-app-association Json File
- APP將apple-app-association注冊(cè)給系統(tǒng)
- 由任意webview發(fā)起跳轉(zhuǎn)的url,如果命中了apple-app-association注冊(cè)過的通用鏈接
- 打開App,觸發(fā)Universal Link delegate
- 沒命中寂呛,webview繼續(xù)跳轉(zhuǎn)url
注意事項(xiàng)
iOS 9.2之前怎诫,不用跨域都可以跳轉(zhuǎn), iOS 9.2之后昧谊,必須跨域才能進(jìn)行跳轉(zhuǎn)到原生app上。
iOS只會(huì)在App第一次啟動(dòng)時(shí)請(qǐng)求一次apple-app-site-association文件酗捌,服務(wù)器上該文件的更新不會(huì)讓iOS本地的文件同步更新呢诬。
下載的文件必須是apple-app-site-association,不能帶后綴胖缤。
apple-app-site-association文件中paths 路徑是大小寫敏感尚镰。
iOS系統(tǒng)還會(huì)記錄用戶的習(xí)慣。
(如果跳轉(zhuǎn)到app內(nèi)后哪廓,用戶點(diǎn)擊了屏幕右上角的按鈕使用Safari打開后狗唉,下次還是點(diǎn)擊出發(fā)跳轉(zhuǎn)的連接的時(shí)候,那么iOS系統(tǒng)會(huì)根據(jù)用戶的使用習(xí)慣直接用Safari或者WebView打開涡真,不會(huì)跳轉(zhuǎn)到App內(nèi)分俯;當(dāng)用戶點(diǎn)擊了WebView或者Safari啟發(fā)跳轉(zhuǎn)連接頂欄那個(gè)”打開”按鈕發(fā)生跳轉(zhuǎn)后,下次打開才會(huì)觸發(fā)跳轉(zhuǎn))
2.實(shí)現(xiàn)步驟
1. 在開發(fā)者中心打開Associated Domains服務(wù)
2. 在 Xcode 的 capabilities 里 添加域名
3. 配置apple-app-site-association文件
{
"applinks": {
"apps": [],
"details": [
{
"appID": "8A7VED9NUX.com.biyao.fu",
"paths":[ "/product/*", "/design/*", "/order/*", "/market/*", "/account/*"]
}
]
}
}
- apps 是限制只能在這幾個(gè)app中使用哆料, 基本是不填寫
- appID:TeamID+.Bundle ID
- paths:可以跳轉(zhuǎn)的路徑缸剪。代表此域名下所有路徑都支持,也可以具體制定到某個(gè)頁面例如/path/page或者某個(gè)路徑下所有URL例如/path/
4. 上傳 apple-app-site-association 文件
- 上傳 apple-app-site-association 文件到域名的根目錄或者.well-known子目錄下
- 服務(wù)器需要支持https
- 能打開https:///apple-app-site-association 或 https:///.well-known/apple-app-site-association
當(dāng)我們的App在設(shè)備上第一次運(yùn)行時(shí)东亦,如果支持Associated Domains功能杏节,那么iOS會(huì)自動(dòng)去獲取域名下的apple-app-site-association文件
5. 在 APP 里處理通用鏈接
我們?cè)贏ppDelegate中實(shí)現(xiàn)如下代理方法:
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
if([userActivity.activityTypeisEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webpageURL = userActivity.webpageURL;
......
}
return YES;
}
3.遇到的問題
由于蘋果iOS 13系統(tǒng)版本安全升級(jí),為此openSDK在1.8.6版本進(jìn)行了適配典阵。 1.8.6版本支持Universal Links方式跳轉(zhuǎn)奋渔,對(duì)openSDK分享進(jìn)行合法性校驗(yàn)。
在配置好Universal Link后壮啊,發(fā)現(xiàn)無法正確連接嫉鲸,每次分享都會(huì)出現(xiàn)二次跳轉(zhuǎn)。
再來看下之前 apple-app-site-association 的配置歹啼,
{
"applinks": {
"apps": [],
"details": [
{
"appID": "8A7VED9NUX.com.biyao.fu",
"paths":[ "/product/*", "/design/*", "/order/*", "/market/*", "/account/*"]
}
]
}
}
這種寫法可以識(shí)別的Universal Link只有這種幾種情況:
- https://www.domain.com/product/
- https://www.domain.com/design/
- https://www.domain.com/order/
- https://www.domain.com/market/
- https://www.domain.com/account/
而直接訪問https://www.domain.com/是不會(huì)命中Universal Link的充坑,這也導(dǎo)致了微信無法識(shí)別
將根目錄添加通配符:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "8A7VED9NUX.com.biyao.fu",
"paths":[ "/product/*", "/design/*", "/order/*", "/market/*", "/account/*","*"]
}
]
}
}
就可以讓直接訪問根目錄https://www.domain.com/的請(qǐng)求也命中,成為有效的Universal Link染突,解決微信的問題捻爷。