上下文
演進(jìn)過(guò)程
iOS9之前,一直使用的是Schema URL技術(shù)來(lái)從外部對(duì)App進(jìn)行跳轉(zhuǎn)揩尸,但是蛹屿,iOS系統(tǒng)中進(jìn)行Schema URL跳轉(zhuǎn)的時(shí)候如果沒(méi)有安裝App,會(huì)提示"Cannot open Page"的提示岩榆,非常不友好错负。
為了解決這個(gè)問(wèn)題坟瓢,研究出了比較成熟的方案來(lái)試探是否已經(jīng)安裝了這個(gè)App,那就是通過(guò)在H5頁(yè)面中嵌入一個(gè)看不到的iframe犹撒,在iframe中進(jìn)行schema的URL跳轉(zhuǎn)折联,通過(guò)定時(shí)器檢查是否已經(jīng)跳轉(zhuǎn)到了App來(lái)帶來(lái)相對(duì)良好的體驗(yàn)。
從iOS9開(kāi)始识颊,蘋果將這一路徑封殺了诚镰,iframe無(wú)法再進(jìn)行Schema URL的跳轉(zhuǎn);但關(guān)上一扇門也打開(kāi)了一扇窗祥款,從iOS9起可以使用Universal Links技術(shù)進(jìn)行跳轉(zhuǎn)頁(yè)面清笨,這是一種體驗(yàn)更加完美的解決方案。
可以使M站與App在iOS進(jìn)行無(wú)縫結(jié)合刃跛,Universal Links的地址采用的是https://domain
這樣的普通網(wǎng)頁(yè)地址的形式函筋,在非自然流量訪問(wèn)m站的情況下,點(diǎn)擊了Universal Links奠伪,如果安裝了App跌帐,那么會(huì)自動(dòng)跳轉(zhuǎn)到App繼續(xù)上一步操作,如果沒(méi)有安裝默認(rèn)情況下則會(huì)請(qǐng)求這個(gè)URL地址繼續(xù)在M站上進(jìn)行操作绊率。
當(dāng)然通常的操作就是會(huì)引導(dǎo)去強(qiáng)制安裝App谨敛,然后在安裝完成的App上進(jìn)行繼續(xù)的操作,這也許與蘋果當(dāng)初的初衷又背道而馳了滤否。
運(yùn)作原理
App在安裝完成的那一刻脸狸,iOS系統(tǒng)如果感知到這個(gè)App打開(kāi)了Associated Domain能力,且添加了符合Universal Links的配置藐俺,就會(huì)從配置的域名下順序分別請(qǐng)求:
https://domain/.well-known/apple-app-site-association
https://domain/apple-app-site-association
從文件中關(guān)聯(lián)App炊甲,做好關(guān)聯(lián)配置。
當(dāng)系統(tǒng)中遇到觸發(fā)Universal Links操作的時(shí)候就會(huì)根據(jù)關(guān)聯(lián)配置對(duì)App進(jìn)行打開(kāi)欲芹,并且將完整地址傳入AppDelegate中專門處理Universal Links的delegate方法中卿啡。
開(kāi)發(fā)者便可以在這個(gè)delegate方法里進(jìn)行相關(guān)處理,延續(xù)之前的操作菱父。
實(shí)踐
準(zhǔn)備條件
- 一個(gè)加入開(kāi)發(fā)者計(jì)劃的賬號(hào)
因?yàn)樘O果Universal Links技術(shù)需要用到Associated Domain的Capability颈娜,而能夠在XCode的Capabilities頁(yè)面中能夠看到并且開(kāi)啟這個(gè)能力的只有加入開(kāi)發(fā)者計(jì)劃的賬號(hào)才能打開(kāi)。
- 一個(gè)可以通過(guò)https請(qǐng)求的域名 二級(jí)三級(jí)都行
這個(gè)比較好解決浙宜,目前github的pages服務(wù)的二級(jí)域名就可以開(kāi)啟https官辽,而且iOS9.3.1系統(tǒng)版本開(kāi)始放寬了對(duì)文件格式必須是text/json的強(qiáng)制規(guī)定,普通的文本格式即可粟瞬。
需要可以通過(guò)https://domain/apple-app-site-association
訪問(wèn)到關(guān)聯(lián)配置文件同仆,否則Universal Links無(wú)法成立,目前這一條件比較寬松
這兩個(gè)條件其中一個(gè)不滿足就無(wú)法成立裙品,果爸果然是霸道俗批!??
第一步:開(kāi)啟Associated Domain能力
使用加入蘋果開(kāi)發(fā)者計(jì)劃的賬號(hào)登錄Xcode俗或。
項(xiàng)目設(shè)置中選中開(kāi)發(fā)者計(jì)劃的賬號(hào),讓Xcode幫助你完成各種一系列創(chuàng)建Profile及相關(guān)配置等扶镀。
到Capabilities選項(xiàng)卡蕴侣,開(kāi)啟 Associated Domain
能力焰轻,并添加一個(gè)項(xiàng)目 applinks:domain
第二步:在domain下添加ios-app-site-association文件關(guān)聯(lián)app
讓網(wǎng)站的https://domain/apple-app-site-association
返回以下內(nèi)容
{
"applinks": {
"apps": [],
"details": [
{
"appID": "ABCDGroupID.com.liuxiaoming.demo.UniversalLinkDemo",
"paths": [ "/scss/*", "/test2/*"]
}
]
}
}
其中appID需要自己拼接 格式為
[GroupID].[BoundleID]
paths中添加匹配的path數(shù)組,支持正則表達(dá)式辱志。
最終以確保 https://domain/apple-app-site-association
可以訪問(wèn)到正確的內(nèi)容
第三步 驗(yàn)證效果
編譯安裝到真機(jī)或者模擬器蝠筑,是否自動(dòng)啟動(dòng)無(wú)所謂,給自己發(fā)一條短信揩懒,內(nèi)容是命中的網(wǎng)址什乙,如例子中 https://domain/css/abc.css
就會(huì)命中Universal Links操作。
點(diǎn)擊自己發(fā)送的短信鏈接已球,系統(tǒng)就會(huì)自動(dòng)跳轉(zhuǎn)到App中了臣镣。
注意點(diǎn)
自然流量
對(duì)于自然流量在domain網(wǎng)站中訪問(wèn)到觸發(fā)Universal Links的情況,iOS并不會(huì)自動(dòng)帶入到App中智亮,只會(huì)在頁(yè)面頂部展示一個(gè)進(jìn)入app的小條忆某,而且需要用戶加載完網(wǎng)頁(yè)后下拉才能看到。
用戶習(xí)慣變更
如果用戶在跳轉(zhuǎn)如app后阔蛉,點(diǎn)擊了右上角返回網(wǎng)頁(yè)弃舒,那么下次就會(huì)繼續(xù)跳網(wǎng)頁(yè)而不會(huì)跳app了,這個(gè)程序無(wú)法控制状原,需要用戶自己在鏈接上長(zhǎng)按聋呢,將其模式切換成跳轉(zhuǎn)app才行。
iOS的bug
我自己嘗試了一些颠区,推測(cè)iOS9 <= version < 10.2
存在一個(gè)bug就是apple-app-site-association
文件更新不及時(shí)削锰,需要重啟并且刪除重新安裝才能生效。version >= 10.2
不存在這個(gè)問(wèn)題毕莱,觸發(fā)過(guò)Universal Links后就會(huì)更新到最新內(nèi)容喂窟。
看了下至少維護(hù)的App下10.2之前的版本已經(jīng)是10%左右了,情況還是比較樂(lè)觀央串,而且更新這個(gè)文件的頻率較少磨澡,也比較難觸發(fā)。
高級(jí)用法
因?yàn)閁niversal Links质和,所有操作無(wú)論在m站還是app中來(lái)回跳轉(zhuǎn)都是可以延續(xù)上一步的操作稳摄,因?yàn)樗袇?shù)都是可以在兩端中拿到,而如果將Universal Links引導(dǎo)到新裝機(jī)則情況就不一樣了App Store將上一步的數(shù)據(jù)隔斷了饲宿,所以業(yè)界也會(huì)使用歸因等技術(shù)讓其連續(xù)起來(lái)厦酬,目前廣泛知曉的Google的Firebase中動(dòng)態(tài)鏈接技術(shù)胆描。