H5唤起App,本地没有则下载
如果只想单纯的打开app,而不去判断是否已经安装,直接使用scheme协议就行了。
如果想实现没有安装就下载app的功能,代码如下:
在浏览器实际上是没有能力判断手机里是否安装了某个App的,所以只能够采取一种投机取巧的方式。
在JavaScript中判断页面是否进入后台来判断打开成功。Html5提供了下列事件和属性可以利用:
- pagehide : 页面隐藏时触发
- visibilitychange : 页面隐藏没有在当前显示时触发(切换tab也会触发该事件)
- document.hidden : 当页面隐藏时,该值为true,显示时为false
上面这些事件或者属性并不是所有浏览器都支持。下面是一个给出为id为openBtn 的按钮添加打开scheme或者下载事件的例子,但对于Android 4.4版本以下则不支持
var downloader,
scheme = 'luwei://', // 需要打开的app scheme 地址
iosDownload='http://xxx.com'; // 如果打开scheme失效的app下载地址
andDownload = 'http://xxx.com';
var u = navigator.userAgent;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
// 给 id 为 openBtn 的按钮添加点击事件处理函数
document.getElementById('openBtn').onclick = function () {
window.location.href = scheme; // 尝试打开 scheme
// 设置3秒的定时下载任务,3秒之后下载app
downloader = setTimeout(function(){
if(isAndroid) {
window.location.href = andDownload;
}
if(isIOS) {
window.location.href = iosDownload;
}
}, 3000);
};
document.addEventListener('visibilitychange webkitvisibilitychange', function () {
// 如果页面隐藏,推测打开scheme成功,清除下载任务
if (document.hidden || document.webkitHidden) {
clearTimeout(downloader);
}
});
window.addEventListener('pagehide', function() {
clearTimeout(downloader);
});