admin管理员组

文章数量:1531793

浏览器调起app应用似乎很奇葩,但总归是有办法解决的。利用的是在浏览器地址栏中输入一个协议,如果有本地程序(应用)能够解析这个协议,那么这个应用将被调起。

说明一下期间存在的问题:

1、在浏览器地址栏中输入的协议如果不能被解析,那么浏览器会给出提示信息,为避免提示信息,可以再页面中嵌入iframe,然后以这个iframe为窗口打开url。或是open一个window打开url,但这种方式,由于无法收到url是否被打开的消息,因而需要做延时回调监控才能关闭这个新打开的窗口,逻辑复杂,不提倡。另外,通过script或img或link src的方式加载url方式无效

2、对是否安装app应用的逻辑分支做说明:

如果安装过app调起app,否则页面跳转到app下载页面,这个逻辑分支实现原理如下:

当在浏览器地址栏输入app定义的协议调起app时,如果已经安装过,系统中断浏览器进程,继而响应app进程,因而在切换到app的时候浏览器中js代码将不再执行,当再次切换回来时系统进程又切回浏览器,js代码从中断处继续执行。所做的逻辑分支就是利用这个关键点。可设置延时来做分支,当app可以被调起时,切换到app,js不再执行,这期中有个app调起时间(与系统有关),如果设置的延时时间过短,则js会继续执行。当切换回来,记录切换回来的时间点,与切换之前比较大于设定时间说明已经切换成功,将不再执行下载,否则下载。

3、app的协议是与app开发同学约定,由app开发同学通过activity scheme设置的

代码如下:

var appInfo = {
    iosUrl: "",    //打开IOS客户端链接
    androidUrl: "",  //打开ANdroid客户端的链接
    downloadUrl: ""  //下载客户端或者去App Store的链接
};

var t1 = new Date().getTime();

iframe2open();
jump2download();

//利用iframe打开客户端
function iframe2open(){
    var src = $.os.ios ? appInfo.iosUrl : appInfo.androidUrl,
        iframe = document.createElement("iframe");

    iframe.src = src;
    iframe.style.display = "none";
    document.body.appendChild(iframe); 
} 

//跳转下载页面
function jump2download(){
    var _timer = null;

    clearTimeout(_timer);
    _timer = setTimeout(function(){
        var t2 = new Date().getTime();

        if (t2 - t1 <= 800) {
            window.location = appInfo.downloadUrl;
        }
    },400);
}

本文标签: 浏览器方法app