最近有一個需求,在手機web網頁上提供一個入口,指引用戶打開 native app,或者下載。
該怎麼作呢?css
<!-- 關鍵所在,匹配相應的 scheme --> <data android:scheme=」baidu」 android:host=」test」 />
打開的話,就是經過 URL, 它會匹配跳轉到 app 對應的 activity 中
baidu://test/...
html
a.href
,若是沒有安裝應用,即打開失敗,就會跳轉到一個錯誤頁面。目前最理想的方式是經過 iframe.src
,上代碼:android
var openApp = { open: function(appurl, downurl) { var t = Date.now(); var i = document.createElement('iframe'); i.src = appurl, // i.style.cssText i.style.position = 'absolute', i.style.left = '-2000px', i.style.top = '-1000px', i.style.width = '1px', i.style.height = '1px', i.style.webkitTransition = 'all 0.9s', i.style.transition = 'all 0.9s', document.body.appendChild(i); var l = function () { document.body.removeChild(i); if (Date.now() - t < 1500) { window.location.href = downurl; } }; i.addEventListener('webkitTransitionEnd', l, false); i.addEventListener('transitionEnd', l, false); setTimeout(function () { i.style.left = '-1000px'; }, 20); } }
原理是:經過 schema 打開 app 以後,手機聚焦就不在 web網頁 上了,進入後臺,這樣時間差就會變大。ios
可是這個方法,有兩個問題:web
在 Android Chrome 下沒有效果,可是還好,它給出了本身的解決方案Android Intents with Chromechrome
在 IOS9 及以上,沒法直接調起,始終會到商店中去,不過也好,apple 給出方案Universal Link瀏覽器
intent: HOST/URI-path // Optional host #Intent; package=[string]; action=[string]; category=[string]; end;
具體使用,還得根據自家產品來微信
{ "applinks": { "apps": [], "details": [ { "appID": "...", "paths": ["/open/*"] } ] } }
applinks:www.test1.com
這樣第一次啓動app的時候,會從 https://test1.com/apple-app-site-association
下載這個文件,交由 IOS 系統管理。這是,web網頁能夠直接發出請求 <a href="https://www.test2.com/open?xxx">
,系統會作出攔截處理。app
參考 IOS9通用連接,這裏講得很詳細了。
ide
PS:
微信中,除了自家產品,其餘估計只有「在瀏覽器打開」 、「應用寶打開」。
UC 中,會攔截scheme,強加上 http(s)://