javascript - 在移動端瀏覽器內判斷使用者是否安裝了某個app

來源:互聯網
上載者:User
現頁面上有一個“立即開啟”按鈕,如果使用者已經安裝了app,則調用相應的app開啟,否則跳轉到下載頁。

已知app的scheme

網上找到的方法1:

$(document).ready(function () {    var log = function (msg) {        $('body').before('' + msg + '');    };    var timeout, t = 1000, hasApp = true;    setTimeout(function () {        if (hasApp) {            log('安裝了app');        } else {            log('未安裝app');        }    }, 2000);    function testApp() {        var t1 = Date.now();        var ifr = $('');        ifr.attr('src', 'diaodiao://');        $('body').append(ifr);        // 插入之後,過1000ms執行try_to_open_app方法        timeout = setTimeout(function () {            try_to_open_app(t1);        }, t);    }    function try_to_open_app(t1) {        var t2 = Date.now();        if (!t1 || t2 - t1 < t + 200) {            hasApp = false;        }    }    testApp();});

方法1並不起作用,頁面上打的log永遠都是“未安裝app”

網上找的方法2:

window.onload = function(){    function isInstalled(){        var originHref = location.href;        var url = originHref.substring(originHref.indexOf('//')+2);        var schemeUrl = "diaodiao://"+url;        window.location=schemeUrl;//開啟某手機上的某個app應用        setTimeout(function(){            window.location="http://a.app.qq.com/o/simple.jsp?pkgname=com.diaox2.android&ckey=CK1308661595241";//如果逾時就跳轉到app下載頁        },20000);    }    var downlink = document.querySelector('.downlink');    downlink.addEventListener('click',function(){        isInstalled();    },false)}

此方法的問題在於,window.location=schemeUrl;這句代碼執行之後,safari彈出一個對話方塊,問要不要使用相應的app開啟,然後緊接著就跳轉到了下載連結(不是定時了嗎?不知道為什麼定時器不起作用?)

-----------------new-------------------

上面2種方法肯定有其適用的時期,這些至少是1年多之前的解決辦法了,隨著IOS/Android系統及瀏覽器的更新,現在已經不適用。。使用iframe呼起app,我在IOS8.3下的safari中是可以呼起的,但是在9.2.1下的safari是不可以的。在Android5.0.1下測試也通不過,只有在Android Chrome下才能呼起。。

遇到一個跟我問題想似的哥們兒,但是貌似沒有很好的回答
ios9下在瀏覽器中通過scheme開啟app的問題
-----------------new-------------------

終於解決了(雖然不那麼優雅,沒有覆蓋所有瀏覽器或webview),寫了一份文檔:
關於在瀏覽器中判斷是否安裝app

同時,謝謝各位不吝賜教!

回複內容:

現頁面上有一個“立即開啟”按鈕,如果使用者已經安裝了app,則調用相應的app開啟,否則跳轉到下載頁。

已知app的scheme

網上找到的方法1:

$(document).ready(function () {    var log = function (msg) {        $('body').before('' + msg + '');    };    var timeout, t = 1000, hasApp = true;    setTimeout(function () {        if (hasApp) {            log('安裝了app');        } else {            log('未安裝app');        }    }, 2000);    function testApp() {        var t1 = Date.now();        var ifr = $('');        ifr.attr('src', 'diaodiao://');        $('body').append(ifr);        // 插入之後,過1000ms執行try_to_open_app方法        timeout = setTimeout(function () {            try_to_open_app(t1);        }, t);    }    function try_to_open_app(t1) {        var t2 = Date.now();        if (!t1 || t2 - t1 < t + 200) {            hasApp = false;        }    }    testApp();});

方法1並不起作用,頁面上打的log永遠都是“未安裝app”

網上找的方法2:

window.onload = function(){    function isInstalled(){        var originHref = location.href;        var url = originHref.substring(originHref.indexOf('//')+2);        var schemeUrl = "diaodiao://"+url;        window.location=schemeUrl;//開啟某手機上的某個app應用        setTimeout(function(){            window.location="http://a.app.qq.com/o/simple.jsp?pkgname=com.diaox2.android&ckey=CK1308661595241";//如果逾時就跳轉到app下載頁        },20000);    }    var downlink = document.querySelector('.downlink');    downlink.addEventListener('click',function(){        isInstalled();    },false)}

此方法的問題在於,window.location=schemeUrl;這句代碼執行之後,safari彈出一個對話方塊,問要不要使用相應的app開啟,然後緊接著就跳轉到了下載連結(不是定時了嗎?不知道為什麼定時器不起作用?)

-----------------new-------------------

上面2種方法肯定有其適用的時期,這些至少是1年多之前的解決辦法了,隨著IOS/Android系統及瀏覽器的更新,現在已經不適用。。使用iframe呼起app,我在IOS8.3下的safari中是可以呼起的,但是在9.2.1下的safari是不可以的。在Android5.0.1下測試也通不過,只有在Android Chrome下才能呼起。。

遇到一個跟我問題想似的哥們兒,但是貌似沒有很好的回答
ios9下在瀏覽器中通過scheme開啟app的問題
-----------------new-------------------

終於解決了(雖然不那麼優雅,沒有覆蓋所有瀏覽器或webview),寫了一份文檔:
關於在瀏覽器中判斷是否安裝app

同時,謝謝各位不吝賜教!

話說好像是這樣,ios下面通常用iframe來開啟你的scheme地址; Android下通常用location.href來。。。
不過實際情況好像比這個複雜得多。。。。
樓主可以參考下這個:http://js.40017.cn/touch/hb/p/openApp.js

暫時沒有測試
先提出一個有可能的解決方案。

非同步請求一下scheme,擷取狀態代碼。(如果scheme有狀態代碼則成立的解決方案)

或者可以直接忽略是否正常開啟了app

用iframe來嘗試開啟scheme uri,不管成不成功,都顯示一個前往下載app

麻煩問下,你寫的
setTimeout(function () {

var timeOutDateTime = new Date();if (!loadDateTime || timeOutDateTime - loadDateTime < 1010) {   window.location = self.dataset.href;}        

},1000);
window.location = 'diaodiao://';

loadDateTime 在哪定義呢,有完整的嗎?

大概說一下iOS9吧,
最近剛把自己的webapp用phonegap打了個包,然後要判斷手機上是不是裝了這個app,如果裝了的話,要能從內容頁直接跳進app中,而且,需求是不能看見那個alert框。
在iOS9下是ok的,只要有一個apple那邊可以認可的https的串連就好。關鍵詞是 Universal Link.網易新聞用的就是這種方式,測試之後,基本能達到判斷的需求。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.