參考:https://github.com/bsxz0604/R...javascript
// dom <a id="openApp" href="javascript:;" title="">當即打開</a> // js ;(function (window) { var ue = {}; // 客戶端檢測 ue.browserInfo = function () { var json = { userAgent: navigator.userAgent.toLowerCase(), isAndroid: Boolean(navigator.userAgent.match(/android/ig)), isIos: Boolean(navigator.userAgent.match(/iphone|ipod|ipad/ig)), isWeChat: Boolean(navigator.userAgent.match(/MicroMessenger/ig)), isQQ: Boolean(navigator.userAgent.match(/ QQ/ig)), isQQBrowser: Boolean(navigator.userAgent.match(/MQQBrowser/ig)) } return json; } // 喚醒APP ue.openApp = function () { var $btnOpenIos = $('#downloadIos'); var browser = ue.browserInfo(); var scheme = ''; var iosVersion = browser.userAgent.match(/os\s*(\d+)/); var universalLink = 'a'; iosVersion = iosVersion ? (iosVersion[1] || 0) : 0; if (browser.isAndroid) { // 安卓 scheme = 'b'; } else if (browser.isIos) { // ios scheme = 'c'; } $btnOpenIos.on('click', function () { //客戶端檢測微信 if (browser.isWeChat) { $('.pop-openbrowser').show(); } else { if (browser.isAndroid) { var ifr = document.createElement('iframe'); ifr.src = scheme; ifr.style.display = 'none'; document.body.appendChild(ifr); setTimeout(function () { document.body.removeChild(ifr); }, 2000); } else { // ios9+ if (iosVersion >= 9) { document.location.href = universalLink; } else { setTimeout(function () { // 必需要使用settimeout var a = document.createElement("a"); //建立a元素 a.setAttribute("href", scheme), a.style.display = "none", document.body.appendChild(a); var t = document.createEvent("HTMLEvents"); // 返回新建立的 Event 對象,具備指定的類型。 t.initEvent("click", !1, !1) // 初始化新事件對象的屬性 a.dispatchEvent(t) // 綁定事件 }, 0) } } var checkOpen = function (cb) { var _clickTime = +(new Date()); function check(elsTime) { if (elsTime > 3000 || document.hidden || document.webkitHidden) { cb(1); } else { cb(0); } } //啓動間隔20ms運行的定時器,並檢測累計消耗時間是否超過3000ms,超過則結束 var _count = 0, intHandle; intHandle = setInterval(function () { _count++; var elsTime = +(new Date()) - _clickTime; if (_count >= 100 || elsTime > 3000) { clearInterval(intHandle); check(elsTime); } }, 20); } checkOpen(function (opened) { // APP沒有打開成功 而且開啓自動跳轉到下載頁 if (opened === 0) { location.href = universalLink } }); } ue.trackEventDownload(); }); }; ue.init = function () { ue.openApp(); }; })(window); $(function () { ue.init(); })
調起APP在不一樣平臺用不一樣的方式,主要就分3個html
* URI Scheme * universal Link * Android App Links
如今仍是有不少第三方(例如魔窗)來協助你處理這個事情,經過接入他們的SDK和客戶端代碼來處理,可是萬變不離其宗,全部的第三方也離不開這3種方式。前端
URI Scheme:java
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]android
例如:ios
git://github.com/user/project-name.git ftp://user1:1234@地址 musically://musical?id=xxxx&key=xxxx
universal Link:git
universal Link 工做方式以下:github
Android App Links:web
URI Scheme的兼容性是最高,在使用的過程當中,會發現有不少限制:json
也就由於會有這些緣由,apple和android都出現了本身第二套解決方案。
從連接上看來,是一個web link,因此也就解決了當沒有app時,跳轉也不會出現報錯,因此相對Scheme優點就提現出來了。
固然universal Link也不是十全十美的,缺陷也是存在的:
差別不大。也是爲了更好的提供調起app出現的google的方案。優勢與 universal Link 差很少,缺點主要以下:
* 國內的支持相對較差,在有的瀏覽器或者手機ROM中並不能連接至APP,而是在瀏覽器中打開了對應的連接。 * 在詢問是否用APP打開對應的連接時,若是選擇了「取消」而且「記住選擇」被勾上,那麼下次你再次想連接至APP時就不會有任何反應
不管哪種方式目前都沒有解決幾個問題:
URI Scheme:
其實使用URI Scheme 部分前端沒有太多能夠排查的問題,會遇到的問題主要是兩個部分。1. 在android的兼容性處理(國內的瀏覽器無力吐槽ing),2. 當沒有安裝app的狀況,URI Scheme 會有各類報錯,也須要處理…
universal Link & app Links
須要注意的內容 & 遇到的問題:
facebook 和 twitter 做爲國外的兩大信息聚合平臺,對於在他們app中調起app也有本身的一套方式。
根據要求經過添加META頭來處理打開APP
facebook:
<meta property="fb:app_id" content="xxxxxx" /> <meta property="og:type" content="xxxx"/> <meta property="og:title" content="xxx" /> <meta property="al:ios:url" content="{{ uri scheme }}" /> <meta property="al:android:url" content="{{ uri scheme }}" /> <meta property="al:ios:app_store_id" content="{{app_store_id}}" /> <meta property="al:ios:app_name" content="{{xxx}}" /> <meta property="al:android:app_name" content="{{xxx}}" /> <meta property="al:android:package" content="{{android:package}}" />
twitter:
<meta name="twitter:card" content="app" /> <meta name="twitter:site" content="xxxxx" /> <meta name="twitter:title" content="xxxxx" /> <meta name="twitter:description" content="xxxxxxx" /> <meta name="twitter:image" content="xxxx" /> <meta name="twitter:app:name:iphone" content="xxx"> <meta name="twitter:app:id:iphone" content="xxx"> <meta name="twitter:app:url:iphone" content="{{Scheme}}"> <meta name="twitter:app:name:ipad" content="xxx"> <meta name="twitter:app:id:ipad" content="xxx"> <meta name="twitter:app:url:ipad" content="{{Scheme}}"> <meta name="twitter:app:name:googleplay" content="xxx"> <meta name="twitter:app:id:googleplay" content="xxx"> <meta name="twitter:app:url:googleplay" content="{{Scheme}}">
從以上內容能夠總結出:要作一個兼容性很好的方案,就須要考慮各類狀況,在不一樣的狀況適配不一樣的方案,比方說用戶是在手機瀏覽器打開仍是微信中打開,或者是在pc中打開,universal link是否被關閉等,這就使代碼實現變得複雜,且容易出錯,且還有安卓平臺機型衆多、瀏覽器衆多等致使的兼容問題。
若是以爲實現難度或者成本過高,你能夠考慮使用第三方提供的服務,例如魔窗的`mLink
。具體請查看官網,在此不贅述。
scheme
universal Link (apple-app-site-association 官方文檔)
apple-app-site-association 配置在 host的根目錄和.well-known下
app links (android app links官方文檔)
assetlinks.json 配置在 host的.well-known下
facebook (facebook app link官方文檔)
twitter (Twitter app card官方文檔)
https://blog.branch.io/notice...
失效現象:
沒法直接喚醒app,而是直接跳轉到appStore,用戶再點擊【打開】。
解決方案:
iOS 開發能夠配置通用連接讓其【強制打開】,可是可能出現該錯誤提示框,這樣給用戶的體驗反而更很差。
騰訊系封殺了除本廠及白名單 app 以外的全部 app 的喚醒功能。