search

Home  >  Q&A  >  body text

javascript - 在移动端浏览器内判断用户是否安装了某个app

现页面上有一个“立即打开”按钮,如果用户已经安装了app,则调用相应的app打开,否则跳转到下载页。

已知app的scheme

网上找到的方法1:

$(document).ready(function () {
    var log = function (msg) {
        $('body').before('<p class="log">' + msg + '</p>');
    };
    var timeout, t = 1000, hasApp = true;

    setTimeout(function () {
        if (hasApp) {
            log('安装了app');
        } else {
            log('未安装app');
        }
    }, 2000);
    function testApp() {
        var t1 = Date.now();
        var ifr = $('<iframe id="ifr"></iframe>');
        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

同时,谢谢各位不吝赐教!

PHP中文网PHP中文网2820 days ago168

reply all(5)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 17:17:04

    话说好像是这样,ios下面通常用iframe来打开你的scheme地址; Android下通常用location.href来。。。
    不过实际情况好像比这个复杂得多。。。。
    楼主可以参考下这个:http://js.40017.cn/touch/hb/p/openApp.js

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 17:17:04

    暂时没有测试
    先提出一个有可能的解决方案。

    异步的请求一下scheme,获取状态码。(如果scheme有状态码则成立的解决方案)

    或者可以直接忽略是否正常打开了app

    用iframe来尝试打开scheme uri,不管成不成功,都显示一个前往下载app

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 17:17:04

    麻烦问下,你写的
    setTimeout(function () {

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

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

    loadDateTime 在哪定义呢,有完整的吗?

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:17:04

    大概说一下iOS9吧,
    最近刚把自己的webapp用phonegap打了个包,然后要判断手机上是不是装了这个app,如果装了的话,要能从内容页直接跳进app中,而且,需求是不能看见那个alert框。
    在iOS9下是ok的,只要有一个apple那边可以认可的https的连接就好。关键词是 Universal Link.网易新闻用的就是这种方式,测试之后,基本能达到判断的需求。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:17:04

    由于安全隐私的原因,目前网页端无法通过js脚本直接判断某个APP是否已安装,只能首先通过js尝试性的启动app,然后再进入安装流程。启动app的方案有schema,universal link,具体详情请参考openinstall

    reply
    0
  • Cancelreply