1闰非、schema
現(xiàn)在線上大多數(shù) App 使用的就是 schema 跳轉(zhuǎn)剩盒,都對(duì)應(yīng)一套路由法則呆瞻,基本都能做到跳轉(zhuǎn)到 App 內(nèi)任一界面台夺。
location.href?=?'schema://xxxx'
但 schema 有個(gè)弊端:
iOS中,如果用戶(hù)沒(méi)有安裝App痴脾,那么他一定會(huì)經(jīng)歷2個(gè)事情:
1颤介、schema打開(kāi)app,但是失敗,延遲后滚朵,跳轉(zhuǎn)下載App
2冤灾、跳轉(zhuǎn)下載App之前schema會(huì)彈個(gè)可惡的跳轉(zhuǎn)失敗的框,然后再延遲后彈跳轉(zhuǎn)AppStore的框
再就是 schema 被微信等應(yīng)用禁止跳轉(zhuǎn)了辕近。
2韵吨、Universal Link
Universal Link和 schema 一樣,目前還未被微信等禁止移宅,也不會(huì)彈出跳轉(zhuǎn)失敗的彈出框归粉。
Universal Link實(shí)現(xiàn)過(guò)程
1、一個(gè)支持 SSL 訪問(wèn)的域名漏峰,且不能是自建證書(shū)的 https 域名
2糠悼、新建一個(gè)apple-app-site-association文件,上傳到域名根目錄下浅乔,或 .well-known 文件夾下倔喂,
apple-app-site-association文件內(nèi)容是一個(gè) json
{
"applinks":
{
"apps":[],
"details":[
{
"appID":"ABCDEFG.com.aaa.bbb.ccc",
"paths":["NOT /aaaa/*","/iosuniversallink/*"]
},
{
"appID":"GFEDCBA.com.aaa.bbb.ccc",
"paths":["NOT /aaaa/*","/iosuniversallink/*"]
}
]
}
}
appId 為 teamId + boundleId
paths 為域名下可識(shí)別或不可識(shí)別的 path 路徑, 如 https://www.xxx.com/iosuniversallink/*, 就可以喚起 app靖苇, 而 https://www.xxx.com/aaaa/xxxxx則直接跳轉(zhuǎn)到 web 頁(yè)了席噩。
注意:該文件沒(méi)有后綴名
附:鏈家 json 文件:https://linkm.lianjia.com/apple-app-site-association
知乎 json 文件:https://oia.zhihu.com/apple-app-site-association
3、配置iOS App工程
開(kāi)發(fā)者中心證書(shū)打開(kāi)Associated Domains
工程配置Associated Domains
將你apple-app-site-association所在域名配置進(jìn)去
給你的工程像Schema的OpenUrl一樣贤壁,編寫(xiě)App被喚醒后的處理邏輯
4班挖、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è)過(guò)的通用鏈接
打開(kāi)App芯砸,觸發(fā)Universal Link delegate
沒(méi)命中,webview繼續(xù)跳轉(zhuǎn)url
在你進(jìn)行apple-app-association 以及 App工程的配置之后给梅,整個(gè)Universal Link的運(yùn)作流程完全由系統(tǒng)控制了
Universal Link 跨域
Universal Link有跨域問(wèn)題假丧,Universal Link必須要求跨域,如果不跨域动羽,就不行包帚,就失效,就不工作运吓。(iOS 9.2之后的改動(dòng))
假如當(dāng)前網(wǎng)頁(yè)的域名是 A
當(dāng)前網(wǎng)頁(yè)發(fā)起跳轉(zhuǎn)的域名是 B
必須要求 B 和 A 是不同域名渴邦,才會(huì)觸發(fā)Universal Link
如果B 和 A 是相同域名,只會(huì)繼續(xù)在當(dāng)前WebView里面進(jìn)行跳轉(zhuǎn)拘哨,哪怕你的Universal Link一切正常谋梭,根本不會(huì)打開(kāi)App
產(chǎn)品需求
如果已安裝App,跳轉(zhuǎn)對(duì)應(yīng)界面
如果沒(méi)安裝App倦青,跳轉(zhuǎn)App下載界面
已安裝App
打開(kāi)App 觸發(fā)handleUniversalLink
走到/_iosuniversallink/分支瓮床,拼接出任意App內(nèi)的界面路由
跳轉(zhuǎn)界面
未安裝App
WebView原地跳轉(zhuǎn)https://xxx.xxx.xxx/_iosuniversallink/*
命中服務(wù)器的重定向邏輯
重定向到AppStore跳轉(zhuǎn)頁(yè)面
打開(kāi)AppStore下載
如果已安裝App,跳轉(zhuǎn)對(duì)應(yīng)界面
如果沒(méi)安裝App,跳轉(zhuǎn)App下載界面
解決了舊Schema模式下的弊端問(wèn)題:
Schema無(wú)法判斷是否安裝App隘庄,只能采用setTimeout的Trick方式
Schema的Trick方式會(huì)有一個(gè)丑陋的錯(cuò)誤跳轉(zhuǎn)彈框
Schema無(wú)法在微信/手百等App內(nèi)踢步,打開(kāi)我們自己的App
簡(jiǎn)單的說(shuō),這樣設(shè)計(jì)的初衷就是丑掺,我不為了通用鏈接這一目的來(lái)使用Universal Link获印,來(lái)統(tǒng)一WAP&APP的URL跳轉(zhuǎn),我就為了把Universal Link當(dāng)做加強(qiáng)版Schema來(lái)使用