背景
最近做了一个618活动页,当用户点击图片的时候,如果本地有APP,唤起本地APP;若没有,则跳转到app store下载。
参考了很多文档,因为安卓和苹果以及各个浏览器还是有很大区别的。针对此次情景总结如下:
安卓&iOS
采用的是通过一段时间内,监听当前页面是否隐藏,如果隐藏了,就说明跳转成功了。PS:因为没有现成的API可以知道是否用户本地有APP,大家有什么好办法,欢迎说出来~~~
// 点击图片唤起APP
poster.onclick = function () {
const isAndroid = /android|adr/gi.test(window.navigator.userAgent);
let url = '客户端提供的url';
// 默认打开本地APP
if (isAndroid) {
callApp(url,1500).then(() => {
console.log('唤起成功')
}).catch(() => {
const downUrl = '下载安卓App的地址'
window.location.href = downUrl;
});
} else {
const downUrl = 'app store中App的地址'
window.location.href = downUrl;
}
}
function callApp(schema, timeOut) {
let timer, start = new Date().getTime();
return new Promise((resolve, reject) => {
// 打开本地app
window.location.href = schema;
// 监听是否隐藏
window.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
// 说明本地有App
clearTimeout(timer);
return resolve();
}
});
// 定时器判断
timer = setTimeout(() => {
let end = new Date().getTime();
if (end - start > timeOut + 1000) {
clearTimeout(timer);
return resolve();
} else {
return reject();
};
}, timeOut);
});
};
注意的点
因为我们只可以通过打开本地app的方式才能知道用户是否已经下载了app,但是当用户本地没有app的时候,iOS默认safari浏览器会有一个默认弹窗
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR50MFRkTxkkaOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3YDN4QzMwQTM1EjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我是真的阻止不掉这里,如果大家有什么好办法,欢迎大家指出来~~
所以我采用的就是直接跳转到app store,通过app store来打开它。