采用设置一个延迟定时器 setTimeout 的方式,第一时间尝试唤起 app,如果 200ms 没有唤起成功,则默认本地没有安装 app,200ms 以后,将会触发下载行为。
var timer = null;
var ifr = document.createElement('iframe');
ifr.src = 'miweng://xcxwap.com/MiDai';
ifr.style.display = 'none';
document.body.appendChild(ifr);
timer = setTimeout(function () {
window.location.href = `app安卓路径`
}, 1000);
想法很美好,现实很残酷。一测试,就发现简单的这样实现有许多的问题。 第一个问题在于,当页面成功唤起 app 之后,我们再切换回来浏览器,发现跳转到了下载页面。 为了解决这个问题,发现各个公司都进行了不同方式的尝试。 也是历经的很多折磨,发现了几个比较有用的事件。 pageshow 页面显示时触发,在 load 事件之后触发。需要将该事件绑定到 window 上才会触发 pagehide 页面隐藏时触发 visibilitychange 页面隐藏没有在当前显示时触发,比如切换 tab,也会触发该事件 document.hidden 当页面隐藏时,该值为 true,显示时为 false 由于各个浏览器的支持情况不同,我们需要将这些事件都给绑定上,即使这样,也不一定能够保证所有的浏览器都能够解决掉这个小问题,实在没办法的事情就不管了。 因此需要扩充一下上面的方案,当本地 app 被唤起,则页面会隐藏掉,就会触发 pagehide 与 visibilitychange 事件
$(document).on('visibilitychange webkitvisibilitychange', function () {
var tag = document.hidden || document.webkitHidden;
if (tag) {
clearTimeout(timer);
}
})
$(window).on('pagehide', function () {
clearTimeout(timer);
})