簡(jiǎn)介
Universal Links
是蘋果自iOS9.0推出的用于應(yīng)用之間跳轉(zhuǎn)的一種安全認(rèn)證機(jī)制,主要用來(lái)通過(guò)HTTPS鏈接來(lái)無(wú)縫啟動(dòng)APP也切。手機(jī)中如果安裝了支持該鏈接的APP就會(huì)直接進(jìn)入到APP中。如果沒(méi)有安裝APP則會(huì)跳轉(zhuǎn)到Safari瀏覽器中腰湾,展示H5頁(yè)面雷恃。
一、Universal Links
配置過(guò)程
- 登錄蘋果賬號(hào)后费坊,點(diǎn)擊創(chuàng)建的APP 的Bundle ID倒槐,跳轉(zhuǎn)到APP 信息頁(yè)面。
- 記錄下
Team ID
和Bundle ID
備用附井。 - 勾選上 功能列表上的 ”Associated Domains“選項(xiàng)讨越。
- 創(chuàng)建一個(gè)text空文本文件,去掉文件后綴永毅,命名為
apple-app-site-association
(不能修改把跨,且不能添加后綴)。 - 文件內(nèi)添加json格式數(shù)據(jù)沼死,內(nèi)容如下
{
"applinks": {
"apps": [],
"details": [
{
"appID":"8ARUHGUQNH.com.YHKJ.AppSample",
"paths": [ "/AppSample/*"]
}
]
}
}
如果一個(gè)域名下面有多端APP着逐,可寫作
{
"applinks":{
"apps":[],
"details":[
{
"appID":"8ARUHGUQNH.com.YHKJ.AppSample",
"paths":["/AppSample/*"]
}
{
"appID":"8ARUHGUQNH.com.YHKJ.appManage",
"paths":["/manageAppSample/*"]
}
]
}
}
apps:為必寫且固定為[ ]
appID是指:TeamID
.BundleId
的組成
paths:是一個(gè)支持的路徑列表字符串?dāng)?shù)組,可以是一個(gè)也可以是多個(gè),用于過(guò)濾可以跳轉(zhuǎn)到App的鏈接耸别,支持通配符*健芭,通配符表示允許該域名下的任意路徑。
details數(shù)組中可以配置多個(gè)APP的信息秀姐,如果有多個(gè)APP需要支持Universal慈迈,則可以直接添加多個(gè)。
嚴(yán)格區(qū)分字母大小寫
-
apple-app-site-association
文件創(chuàng)建好后 發(fā)給后臺(tái)省有,讓后臺(tái)放到域名的服務(wù)器根目錄下痒留,也可以在根目錄中添加.well-known文件夾,將文件上傳到.well-known文件夾下(.點(diǎn)一定不能少)锥咸,對(duì)應(yīng)連接分別為
https://xxx/apple-app-site-association
https://xxx/.well-known/apple-app-site-association
xxx為服務(wù)端的域名
- 打開你的iOS工程狭瞎,如下添加“Associated Domains”功能 和 域名地址,
applinks:域名地址
搏予,Domains中的域名必須是使用applinks開頭熊锭。
二、測(cè)試Universal Link鏈接
蘋果提供了一個(gè)網(wǎng)頁(yè)來(lái)驗(yàn)證我們編寫的這個(gè)apple-app-site-association文件是否合法有效,
https://search.developer.apple.com/appsearch-validation-tool/
如果 Universal Link 配置成功雪侥,在iOS自帶Safari瀏覽器中碗殷,打開 Universal Link 鏈接,下拉會(huì)出現(xiàn)應(yīng)用入口速缨,點(diǎn)擊“打開”可以跳轉(zhuǎn)至原生App锌妻;如打開微信的 Universal Link : https://help.wechat.com/app/
如下圖
二 、Universal Link 的運(yùn)行機(jī)制原理
- 當(dāng)App初次安裝后或者更新版本后的第一次啟動(dòng)(第二次啟動(dòng)就不會(huì))旬牲,向工程配置的applinks:的域名請(qǐng)求apple-app-site-association配置文件仿粹。
- App自動(dòng)的將apple-app-site-association配置文件向iOS系統(tǒng)配置。
- 當(dāng)任何WebView發(fā)起UniversalLink的url的時(shí)候原茅,系統(tǒng)遍歷注冊(cè)過(guò)的通用鏈接吭历,如果命中則直接打開App觸發(fā)Delegate方法。
- 如果沒(méi)命中擂橘,WebView繼續(xù)跳轉(zhuǎn)加載url晌区。
以上都是系統(tǒng)默默替你做的,我們要做的就是確保配置的正確性通贞。
三 朗若、注意事項(xiàng)
- 服務(wù)器的域名地址必須是HTTPS的,并且SSL證書必須通過(guò)蘋果信任昌罩。蘋果支持的HTTPS證書列表哭懈。
- apple-app-site-association名稱不能變,不能加后綴,只能放在上面說(shuō)的服務(wù)器位置茎用。但是 iOS 會(huì)先去請(qǐng)求.well-known 路徑遣总,如果apple-app-site-association文件請(qǐng)求不到你虹,再去請(qǐng)求根目錄,所以如果想要避免服務(wù)器接收過(guò)多GET請(qǐng)求彤避,可以直接把a(bǔ)pple-app-site-association文件放到well-known目錄下。
- 服務(wù)器上apple-app-site-association的更新不會(huì)讓iOS本地的apple-app-site-association同步更新夯辖,Universal Link的更新 只有在APP第一次安裝 和 更新版本的時(shí)候琉预,如果Universal Link有變更,只能重新打包發(fā)版蒿褂,然后讓用戶更新版本或者卸載重裝圆米。
- 跨域問(wèn)題,如果由當(dāng)前網(wǎng)頁(yè)跳轉(zhuǎn)Universal Link打開APP啄栓,當(dāng)前網(wǎng)頁(yè)的域名和Universal Link 的域名必須 不能一致娄帖,否則不會(huì)跳轉(zhuǎn),只會(huì)在當(dāng)前的WebView里面跳轉(zhuǎn)昙楚。
- 由瀏覽器或其他app應(yīng)用跳轉(zhuǎn)進(jìn)入我自己的APP時(shí)接收回調(diào)近速,要在AppDelegate.m/SceneDelegate.m中實(shí)現(xiàn)下面回調(diào)方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// NSUserActivityTypeBrowsingWeb 由Universal Links喚醒的APP
if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
return YES;
}
NSURL *jumpUrl = userActivity.webpageURL; // 這個(gè)URL就是你跳轉(zhuǎn)的那個(gè)URL,下載頁(yè)地址堪旧,想要傳參數(shù)可以直接在URL后面拼接
// TODO:在這里進(jìn)行跳轉(zhuǎn)具體頁(yè)面的操作
return YES;
}
四 削葱、Universal Links 與 URL Scheme
另一種 外部喚起App 的方式是URL Scheme
,但是URL Scheme有一些弊端。
Universal Links
具有唯一性淳梦,比較安全析砸。它是使用標(biāo)準(zhǔn)的HTTPS協(xié)議鏈接到你的web站點(diǎn),所以一般不會(huì)被其它的APP所聲明爆袍。而URL Scheme
是由開發(fā)者自定義的首繁,沒(méi)有限制,任何App都可以用同一個(gè)名字陨囊,有些釣魚App可以 設(shè)置知名的APP 的URL Scheme 來(lái)欺騙用戶弦疮。URL Scheme
可以通過(guò)canOpenURL
判斷用戶是否安裝App,但是只有安裝了APP才能跳轉(zhuǎn),未安裝則沒(méi)有效果谆扎。而Universal Links
如果安裝了就跳轉(zhuǎn)APP挂捅,如果未安裝就跳轉(zhuǎn)網(wǎng)頁(yè)展示你網(wǎng)站的內(nèi)容,比較靈活堂湖。使用scheme跳轉(zhuǎn)系統(tǒng)會(huì)彈框提示闲先,替換成UL鏈接后可以實(shí)現(xiàn)無(wú)縫跳轉(zhuǎn)。