已知喚醒app方式
- URL Schemes
- chrome intent
- ios UniversalLink / android appLink
URL Scheme
URL Schemes
可以理解為一種特殊的URL用來定位一個應用以及應用內的某個功能,完全可以按照理解一個網頁的URL來理解一個應用的URL
使用
跟打開一個鏈接一樣,常見的有:
- location.href
- iframe
- a標簽
使用中常見問題及解決方案
- 可能會被app禁掉,比如微信,qq等
- ios9+ 禁止掉了iframe方式。
- ios及部分安卓瀏覽器會提示用戶是否打開App,並且ios在未安裝對應App的時候,會提示“打不開網頁,因為該網址無效”
- h5無法感知是否喚醒成功
- 大部分瀏覽器需要用戶手動觸發鏈接,js自動觸發無效
針對被app禁止掉的情況,通常會判斷是否微信等app環境,然后提示用戶瀏覽器內打開 針對ios9+ iframe
被禁掉的情況,判斷下ios版本 針對h5無法感知是否喚醒成功的解決辦法是,一段時間之后自動跳轉下載頁,或者是依賴setTimeout在瀏覽器進入后台后進程切換導致的時間延遲判斷。
if (isAndroid) { //安卓終端使用iframe iFrame = document.createElement("iframe"); iFrame.setAttribute("src", urls); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 發起請求后這個 iFrame 就沒用了,所以把它從 dom 上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; // 如果用戶沒有安裝APP,則提示用戶去安裝APP setTimeout(() => { window.location.href = "https://www.pgyer.com/A2fc"; // 這里可以自行寫一個延時關閉的彈窗,也可以跳轉至app下載地址 }, 2000); } else if (isiOS) { //iOS終端直接頁面跳轉 window.location.href = urls; // 如果用戶沒有安裝APP,則提示用戶去安裝APP setTimeout(() => { window.location.href = "https://www.pgyer.com/A2fc"; // 這里可以自行寫一個延時關閉的彈窗,也可以跳轉至app下載地址 }, 2000); } else { window.location.href = urls; }
Intent
安卓的原生谷歌瀏覽器從chrome25
版本之后就不能通過URL Schemes
喚醒安卓應用。要使用谷歌官方提供的intent:
預發, 如果喚醒失敗,則會跳轉到谷歌的應用市場。語法與URL Schemes
及其相似,相當於谷歌定制版的URL Schemes
,也沒用過,就不多說。
IOS Universal Link
Universal Link
是在iOS9引入的新功能,通過傳統的HTTP鏈接就可以喚醒app,如果用戶沒有安裝APP,則會跳轉到該鏈接對應的頁面,而且在喚醒app的時候沒有彈框提示
原理
App開發人員去配置中心配置Associated Domain
配置一個支持https
的域名,比如app-support.tuyacn.com
- 然后 app-support.tuyacn.com/apple-app-site-association
或者app-support.tuyacn.com/apple-app-site-association/.well-known/apple-app-site-association
要返回app的teamId,bundleId,paths
信息
常見問題
- 微信等幾個App還是給屏蔽了
- 從9.3.X改版之后,通用鏈接不支持域內跳轉了,跳轉前后的兩個domain必須是不同的,否則只會safari打開。跨域問題:假設當前網頁的地址為 http://yoursite.com/a/,如果要跳轉的鏈… http://yoursite.com/a/ 這個域下的,系統將不會進行拉起應用的操作,必須要跳轉不同的子域,例如 http://yoursite.com/b/* 時,系統才會根據關聯文件去判斷是否要拉起應用。
- 服務器上
apple-app-site-association
的更新不會讓iOS本地的apple-app-site-association
同步更新,即iOS只會在App第一次啟動時請求一次,以后除非App更新
或重新安裝
,否則不會在每次打開時請求apple-app-site-association
。
Android App Links
安卓App Link
的出現原因也是為了優化用戶體驗,在使用scheme
喚醒時會彈出一個對話框提示用戶是否打開,並且如果用戶勾選了取消之后,可能之后就再也喚醒不了。
安卓App Link
的流程和iosUniversal link
的類似,iOS中需要配置的app-support.tuyacn.com/apple-app-site-association
文件在安卓中叫做app-support.tuyacn.com/.well-known/assetlinks.json
,只能放在.well-known
下面