如何检测用户是否装了某APP?

如果安装了就打开这个APP,,要兼容IOS和Android
之前看了好多文章,比较老了,有很多的坑,不知道现在的最佳解决方案是什么呢?

阅读 8.6k
3 个回答

判断UA只能判断当前进入H5的浏览器,比如你就算判断UA是微信,你怎么知道装了微博?实现不了。

现在一般的处理如下:

  1. 使用url-schema跳转到APP
  2. 不管跳没跳过去,延迟一段时间,比如(3S)之后显示浮层(内容为发现未安装APP
  3. 跳转成功后,用户会看到APP,看不到你这个H5页,H5显示发现未安装APP没关系, 因为用户看不到
  4. 跳转失败后,用户会看到发现未装app,你可以在页面上放链接或按钮引导安装

我们目前就是做这部分的工作,说下目前的现状!或者你搜到的文章大概也是这个意思。

各个APP都会设置自己的白名单,比如微信中的jsapi只能检测和打开腾讯系和白名单中的APP,其他的APP使用是没有效果的!微信中只能引导用户去浏览器中打开,然后再在浏览器中操作。

可是在浏览器中的一个问题是,我们无法检测当前设备中是否已经安装了某APP,而且目前也没有方法检测。我们的代码中根本不检测安装态:

// 空的,浏览器下无法检测app的安装状态
checkAppIsInstalled(
    callback = (isInstalled: boolean) => {
        console.log(isInstalled);
    }
): Promise<boolean> {
    return new Promise(resolve => {
        let isInstalled = false;
        callback(isInstalled);
        resolve(isInstalled);
    });
}

能做的就是尝试打开,然后延迟下载:尝试用scheme地址打开某个APP,若打开了,则说明安装了,否则1500ms后去下载APP。只能是这样。

浏览器中运行的代码,你们可以参考下:

run(openUrl: string = '') {
    this.openApp(openUrl);
    const startTime = new Date().valueOf();
    setTimeout(() => {
        const endTime = new Date().valueOf();
        // 当前页面可见时,且满足事件间隔要求,则去下载
        if (pageVisibility() && 1560 > endTime - startTime) {
            this.download();
        }
    }, 1500);
}
openApp(openUrl: string = '') {
    const __openUrl: string = openUrl || this.__data['openUrl'];

    if (!__openUrl) {
        throw new Error(`BrowserDownloader.openApp: openUrl is needed`);
    }
    if (os.android) {
        let e = document.createElement('iframe');
        e.style.cssText = 'width:1px;height:1px;position:fixed;top:0;left:0;';
        e.src = __openUrl;
        document.body.appendChild(e);
    } else {
        window.location.href = __openUrl;
    }
}

download(callback?: any) {
    if (typeof callback === 'function') {
        callback();
    } else {
        if (os.android) {
            window.location.href = this.__data['downloadUrl'];
        } else {
            window.location.href = 'http://itunes.apple.com/cn/app/id' + this.__data['appleStoreId'];
        }
    }
}

重点是run()方法:先去尝试打开,如果1500ms执行到回调函数,则说明打开失败了,去下载。这里判断页面可见性的原因是:在iOS13里,正常呼起APP后,定时器没有被挂起,所以再用页面可见性再次进行检测!

基本上现在是用url schemes
可以试试,用schemes去尝试打开app。
如果安装了,启动app需要的时间较长,js中断时间长,如果没安装,js瞬间就执行完毕。但是可能兼容性是个问题。

看看这个大佬https://juejin.im/post/59eb06e4f265da432f304206

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题