解决React中打开App或者下载App问题
摘要
最近在写H5页面,项目中有个唤醒App的功能,由于没有接触过这类功能,就去学习了一波大佬们的经验。在此分享出来和大家一起学习学习。
内容
一、唤醒方式
经过查找资料,找到了三类较为客观的唤醒方式:
1.URL Schemes
2.Chrome
3.ios UniversalLink / android appLink
二、常用的唤醒媒介
除了需要确定的唤醒方式,还需要搭配唤醒媒介来一起作用,具体的常用的唤醒媒介如下:
1.ifame
2.a 标签(元素)
3.widnow.location
三、常规打开方式:URL Scheme
唤醒打开一个App,最常规的方式就是通过URL Scheme。那scheme是什么呢,它就像是路标一样,它可以让操作者通过scheme这个路标来打开App,对于App的开发处理就不做过多的描述,感兴趣的朋友可以去百度、谷歌搜索。对于前端而言,抛出scheme路标的媒介有三个,其中个人认为比较友好的方式是通过iframe媒介来抛出,对于其他媒介抛出方式感兴趣的朋友可以去探寻一番,接下来直接用代码分享,清晰明了的去使用常规scheme唤醒App方式。
四、代码
1、首先我们需要一个iframe媒介。
2、其次是我们需要一个URL Scheme唤醒方式。
3、最后就是通过设备判断,并打开我们需要的App应用。
为了方便引用这个唤醒APP的方式,我把它封装成了一个通用的downloadApp.js函数组件,重点代码如下:
(1)创建iframe媒介:
// 创建iframe
const createIframe = (function() {
let iframe;
return function() {
if (iframe) {
return iframe;
} else {
iframe = document.createElement('iframe')
iframe.style.display = 'none';
document.body.appendChild(iframe);
return iframe;
}
}
})()
(2)定义url Scheme唤醒方式:
// 定义App的scheme 测试使用淘宝的scheme
const baseScheme = "taobao://";
const createScheme = function(options, isLink) {
let urlScheme = baseScheme;
for(let item in options) {
urlScheme = urlScheme + item + '=' + encodeURIComponent(options[item]) + '&';
}
urlScheme = urlScheme.substring(0, urlScheme.length - 1);
return encodeURIComponent(urlScheme);
}
(3)定义唤醒App函数:(函数中的判断客户端设备类型的函数可以去百度,或者看我上一篇文章:Javascript判断客户端是Android还是IOS,判断浏览器类型)
const openApp = function() {
let localUrl = createScheme();
let openIframe = createIframe();
if (isIos) {
// 判断是否是ios
window.location.href = localUrl;
const loadDateTime = Date.now();
setTimeout(function() {
const timeOutDateTime = Date.now();
if (timeOutDateTime - loadDateTime < 1000) {
window.location.href = "下载URL";
}
}, 25);
} else if (isAndroid) {
// 判断是否是安卓
if (isChrome) {
// Chrome浏览器用iframe打不开
window.location.href = localUrl;
} else {
// 抛出scheme
openIframe.src = localUrl;
}
setTimeout(function() {
window.location.href = "下载URL";
}, 500);
} else {
// 给winphone用户准备
openIframe.src = localUrl;
setTimeout(function() {
window.location.href = "下载URL";
}, 500);
}
}
总结
这就实现了唤醒打开App的功能,当然的,唤醒打开需要你有App,如果你没有App,就需要跳过下载链接去下载App了。在代码中不但实现了唤醒打开功能,还加入了下载功能,这样应用起来就更全面,用户体验也更加友好。但是这样的常规方式还是不够完美,就比如ios9.0以上版本唤醒或者下载App时就不会直接的跳转,有时甚至还会有允许的弹窗。存在的问题还需要进一步的去优化,本次就先分享唤醒App应用那么多功能,如果感兴趣可以一起去研究如何更全面、更友好的去优化唤醒功能。这篇文章是在看了很多资料后,提取合并大佬们的经验来分享编写的,如有错误,请指教。最后附上参考的大佬文章地址:参考文章...