如果安装了就打开这个APP,,要兼容IOS和Android
之前看了好多文章,比较老了,有很多的坑,不知道现在的最佳解决方案是什么呢?
我们目前就是做这部分的工作,说下目前的现状!或者你搜到的文章大概也是这个意思。
各个APP都会设置自己的白名单,比如微信中的jsapi只能检测和打开腾讯系和白名单中的APP,其他的APP使用是没有效果的!微信中只能引导用户去浏览器中打开,然后再在浏览器中操作。
可是在浏览器中的一个问题是,我们无法检测当前设备中是否已经安装了某APP,而且目前也没有方法检测。我们的代码中根本不检测安装态:
// 空的,浏览器下无法检测app的安装状态
checkAppIsInstalled(
callback = (isInstalled: boolean) => {
console.log(isInstalled);
}
): Promise<boolean> {
return new Promise(resolve => {
let isInstalled = false;
callback(isInstalled);
resolve(isInstalled);
});
}
能做的就是尝试打开,然后延迟下载
:尝试用scheme地址打开某个APP,若打开了,则说明安装了,否则1500ms后去下载APP。只能是这样。
浏览器中运行的代码,你们可以参考下:
run(openUrl: string = '') {
this.openApp(openUrl);
const startTime = new Date().valueOf();
setTimeout(() => {
const endTime = new Date().valueOf();
// 当前页面可见时,且满足事件间隔要求,则去下载
if (pageVisibility() && 1560 > endTime - startTime) {
this.download();
}
}, 1500);
}
openApp(openUrl: string = '') {
const __openUrl: string = openUrl || this.__data['openUrl'];
if (!__openUrl) {
throw new Error(`BrowserDownloader.openApp: openUrl is needed`);
}
if (os.android) {
let e = document.createElement('iframe');
e.style.cssText = 'width:1px;height:1px;position:fixed;top:0;left:0;';
e.src = __openUrl;
document.body.appendChild(e);
} else {
window.location.href = __openUrl;
}
}
download(callback?: any) {
if (typeof callback === 'function') {
callback();
} else {
if (os.android) {
window.location.href = this.__data['downloadUrl'];
} else {
window.location.href = 'http://itunes.apple.com/cn/app/id' + this.__data['appleStoreId'];
}
}
}
重点是run()
方法:先去尝试打开,如果1500ms执行到回调函数,则说明打开失败了,去下载。这里判断页面可见性的原因是:在iOS13里,正常呼起APP后,定时器没有被挂起,所以再用页面可见性再次进行检测!
基本上现在是用url schemes
可以试试,用schemes去尝试打开app。
如果安装了,启动app需要的时间较长,js中断时间长,如果没安装,js瞬间就执行完毕。但是可能兼容性是个问题。
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
判断UA只能判断当前进入H5的浏览器,比如你就算判断UA是
微信
,你怎么知道装了微博?实现不了。现在一般的处理如下:
发现未安装APP
)发现未安装APP
没关系, 因为用户看不到发现未装app
,你可以在页面上放链接或按钮引导安装