判断移动端是否安装某个app

最近在项目中遇到一个需求:

从app内部分享出去的网页顶部有一个“打开”按钮,用户点击后:
1、若用户客户端安装我们的app,直接跳转到我们的app;
2、若用户没有安装,跳转到应用宝提示用户下载;

我们需要知道的是:

  • 我们并不能通过浏览器来判断用户手机是否安装某个app;
  • 但是我们可以通过JS设置一个定时器试着唤醒手机端的某个app的本地协议(url scheme)如果能解析这个协议那么就能直接打开app,如果唤醒超时则跳转到应用宝下载页;
  • 微信内置浏览器已禁止使用外部url scheme直接跳转至其他app;

让我们简单了解一下什么是url scheme?

url scheme:
1、简单来说就是一个让app相互之间跳转的协议。
2、每一个app的url scheme是不一样的,例如微信的scheme协议:weixin://。
3、如果两个app拥有相同的url scheme,那么后安装的app会把之前安装的app的url scheme覆盖掉;
4、一般url scheme是有服务端的同事提供,我们只要复制上去就可以了;
5、我们的app需要使用支付宝的三方支付功能、app需要使用微信分享好的文章,那么此时就可以通过URL Scheme来传递这些数据到支付宝app或者微信app系统会通过这些app的url scheme来调起这些app,完成你所需要做的跨app的功能

参考代码(开头提到的需求):
思路:

  • 我们需要考虑微信端和非微信端的调起情况;
  • 可以新建一个iframe,iframe的src指向app的scheme协议,然后把iframe操作在DOM上。
    (可以网上自行查找常用的url scheme进行demo)

var app_links = "应用宝跳转链接(同事提供)",
    url_scheme = "app的url scheme协议(同事提供)",
// app link
function deeplink() {
    if (/MicroMessenger/i.test(navigator.userAgent)) {
        window.location.href = app_links;
    } else {
        window.location.href = url_scheme;
        var ifr = document.createElement("iframe");
        ifr.src = url_scheme;
        ifr.style.display = "none"
        document.body.appendChild(ifr);
        window.setTimeout(function () {
            document.body.removeChild(ifr);
            if (!document.hidden) {
                window.location.href = app_links;
            }
        }, 2000)
    }
}

//调用方法
//js调用
//var open_btn = //document.getElementById("open_btn");
//open_btn.onclick = function () {
//            deeplink();
  //      };
//jQuery调用
$(document).ready(function () {
    $('#open-btn').on('click', function () {
        deeplink();
    });
})

补充需求:
有些项目还需要给分享之后的链接拼接一个动态的time时间戳:

  • 可先获取当前的时间戳var time = new Date().getTime();
  • 然后拼接到app协议的后边:如:
    var app_links = "应用宝跳转链接(同事提供)"+'&time='+time;

项目踩坑记录,会不断完善,如果有错误的地方,可以指出,共同进步。

你可能感兴趣的:(判断移动端是否安装某个app)