近期公司須要針對分享流程進行優化,其中一點就是 前端H5檢測是否安裝應用,來進行不一樣的判斷(下載或直接跳轉到app中)。原理很簡單:建立一個 iframe去打開 uri。若是打開app成功網頁進入後臺,再切換回來時間會超過2.5s。 利用時間去檢測。下面來看具體實現過程:
都會在文中找到答案。前端
這裏的uri,指得就是經過 Url scheme 來實現的H5與安卓、蘋果應用之間的跳轉連接。
咱們須要找到客戶端的同事,來獲取以下格式的連接。android
xx://'跳轉頁面'/'攜帶參數'
這裏給你們簡單解釋下url scheme。
url 就是咱們日常理解的連接。
scheme 是指url連接中的最初位置,就是上邊連接中 ‘xx’的位置。
詳細介紹能夠看這裏: 使用url scheme詳解
用這個連接咱們能夠跳轉到 應用中的某個頁面,並能夠攜帶必定的參數。這個是咱們實現這個功能的前提喲。web
Android平臺則各個app廠商差別很大,好比Chrome從25及之後就再也不支持經過js觸發(非用戶點擊),因此這裏使用iframe src地址等來觸發scheme。
//在iframe 中打開APP var ifr = document.createElement('iframe'); ifr.src = openUrl; ifr.style.display = 'none';
原理:若經過url scheme 打開app成功,那麼當前h5會進入後臺,經過計時器會有明顯延遲。利用時間來判斷。
//檢查app是否打開 function checkOpen(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); }
這裏使用的是 應用寶微連接實現。
if (callback) { //客戶端檢測微信直接跳應用寶連接 var browser = BrowserInfo(); //使用微連接 var encodeUri = encodeURIComponent('你的uri'); if (browser.isWeixin) { window.location.href = '你的微鏈url&android_schema='+encodeUri; }else{ checkOpen(function(opened){ callback && callback(opened); }); } }
export const openApp = function(openUrl, callback) { //檢查app是否打開 function checkOpen(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); } //在iframe 中打開APP var ifr = document.createElement('iframe'); ifr.src = openUrl; ifr.style.display = 'none'; if (callback) { //客戶端檢測微信直接跳應用寶連接 var browser = BrowserInfo(); //使用微連接 var encodeUri = encodeURIComponent(openUrl); if (browser.isWeixin) { window.location.href = '你的微鏈url&android_schema='+encodeUri; }else{ checkOpen(function(opened){ callback && callback(opened); }); } } document.body.appendChild(ifr); setTimeout(function() { document.body.removeChild(ifr); }, 2000); }
/** * 客戶端檢測 */ export const BrowserInfo = function() { var json = { userAgent: navigator.userAgent.toLowerCase(), isAndroid: Boolean(navigator.userAgent.match(/android/ig)), isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)), isIpad: Boolean(navigator.userAgent.match(/ipad/ig)), isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)), } return json; }
頁面中能夠經過傳遞迴調函數,來獲取返回值;並經過是否傳這個參數來作進入頁面檢測。