最近公司App產品在運營推廣上有一個需求,就是要求可以讓用戶在訪問我們的推廣網頁時,就可以判斷出這個用戶手機上是否安裝了我們的App,如果安裝了則可以直接在網頁上打開,否則就引導用戶前往下載。從而形成一個推廣上的閉環。
在iOS上,其實只需要在<head>標簽內增加一個<meta>標簽,系統就會自動幫你在頂部生成一個Banner,而且會智能引導用戶操作(如果未安裝就跳轉AppStore,否則直接打開)。格式如:<meta name='apple-itunes-app' content='app-id=你的APP-ID'>。比如加一個百度貼吧的Native APP大Banner,用下面這串兒代碼:
<meta name='apple-itunes-app' content='app-id=477927812'>
但是上面的方法僅限於iOS設備,且無法定義Banner的形式。另外打開應用時也無法告訴App端要做什么操作。(因為后來運營有提出了新的需求,比如在推廣網頁上打開的App就直接進行某項操作。)
那么,我們可以通過另外一種協議的方式來達到上述要求的效果,即:
1.可以在web頁面中直接打開App。
2.打開App的同時可以進行傳值操作,告訴移動端程序應該做什么。
前提:知道你的App對應的打開協議。例如百度貼吧的協議為:com.baidu.tieba://,微信的協議為:weixin://,等等。
方法一:
function runApp(rid) { var state = null; try { state = window.open("myapp://jest.app/openwith?id=" + rid, '_self'); } catch (e) { alert("發生未知錯誤:" + state + ",請聯系運營商."); } }
方法一直接利用window.open的方式來打開應用,rid是要告訴移動端的值,這里只寫了一個,大家可以根據實際情況來定義自己的參數。打開方式這里定義為_self,是因為如果是_blank的話,會重新打開一個選項卡, 不是很友好。 另外這個方法對於Andriod設備的兼容性不是很好, 不建議在Andriod設備上執行此方法。
方法二:
function runApp2(rid) { var ifrSrc = "myapp://jest.app/openwith?id=" + rid; var ifr = document.createElement('iframe'); ifr.src = ifrSrc; ifr.style.display = 'none'; document.body.appendChild(ifr); // 點擊后延時觸發清除iframe,並跳轉頁面 setTimeout(function () { document.body.removeChild(ifr); }, 200); }
方法二是利用iframe的方式來進行打開,同樣rid是要傳遞的參數。這個方法我測試了一些Andriod設備,感覺還是比較好的。 但是iOS體驗較差, 建議大家自己根據實際情況,結合使用。
最后說下關於沒有安裝App時的處理方法。基本上網上大家搜的打開方式都是通過協議的方式, 那么如果用戶在觸發打開條件后, 一定時間內沒有打開應用,我們就可以確定該用戶是沒有安裝對應的App。 那么我們可以通過延時函數來進行后續的引導操作。