浅谈Html5页面打开app的一些思考


Posted in HTML / CSS onMarch 30, 2020

1. 需求

前段时间开发项目,遇到了一个需求,简单来说,就是我们H5的页面有一个“在App中打开”的按钮,用户点击后,如果用户已经安装app,则直接打开app,如果用户没有安装app,那就跳转到下载app的页面

首先,在我的认知中,H5应该是没有能力检测到某一款app是否有安装的(如果有小伙伴知道如何检测,欢迎评论区告诉我,感谢!),所以我们需要一些技巧来完成判断app是否安装这一过程。

之后的步骤以安卓手机为例子介绍,目前ios9版本之后的系统不需要我们H5做这些判断app是否安装的流程(ios9之后可以通过提供一个通用链接(Universal link),做到没有安装app提示打开苹果应用商城,安装了app则直接跳转打开)

2. 关于scheme协议

scheme协议是一种页面内跳转协议,我们可以通过定制scheme协议,跳转到app中的想要跳转的各个页面。scheme协议是通过url的形式进行跳转的,所以我们H5也可以通过这个url去跳转到app内指定页面,这就是H5打开app的原理。

scheme的url格式类似: [scheme]://[host]/[path]?[query]

3. H5实现在App中打开的两种方法

3.1 单纯使用定时器判断

这种的方法的思路是,首先把我们要跳转的地址设置为与原生App同学一起定义好的scheme的url,之后,设置一个定时器,定时器里执行的逻辑是跳转到下载app页面,这样,如果用户手机没有安装app,就会在一段时间后跳转到下载页面。

核心代码如下:(可以使用iframe完成跳转,但需要考虑iframe是否在ios等设备中被允许)

const schemeUrl = 'xxx'
const downloadUrl = 'XXX'
const wait = 500
try {
    location = schemeUrl
    setTimeout(() => {
        location = downloadUrl
    }, wait)
} catch (e) {
    console.error(e)
}

存在的问题

上述实现方案的问题是,即使成功跳转到App,原先的H5页面也会在定时时间后,跳转到下载页面,这样体验很不好

3.2 使用window的hidden属性判断

这个方法的思路是,如果成功唤起了app,我们的H5页面被置于后台,window.hidden属性会变为true,可以通过这个属性变化来判断app有没有打开,没打开就跳转到下载页面,当然这里也用到定时器

核心代码如下:

function checkOutApp() {
    const schemeUrl = 'xxx'
    const downloadUrl = 'XXX'
    const wait = 1000
    // 是否进入后台
    const hidden = false
    location = schemeUrl
    // 如果一定时间内,页面没有隐藏,则跳转到下载页
    setTimeout(() => {
        if (!hidden) {
            location = downloadUrl
        }
    }, wait)
    // 页面可见性变化事件
    document.addEventListener("visibilitychange", function(){
        if (document.hidden) {
            hidden = true
        }
    });
}

存在的问题

目前一些安卓浏览器,在app存在时,会首先跳出一个确认框,询问用户是否打开app,只有用户同意时,才会跳转app,如果用户始终没有点击确认,最后还是会跳到下载页面,体验不好

4. 一些思考

鉴于上面说到的一些问题,个人觉得可以在交互中增加一个“去下载页面”的交互,如果用户没有安装app,一定时间后,首先提示用户“是否没有安装app,点击去下载”类似的按钮,用户点击跳转到下载页面,这样会不会更好呢。

到此这篇关于浅谈Html5页面打开app的一些思考的文章就介绍到这了,更多相关Html5打开app内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
CSS3悬停效果案例应用
Nov 21 HTML / CSS
浏览器实现移动端高性能css3动画(开启gpu加速)
Dec 23 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
Jan 12 HTML / CSS
10分钟入门CSS3 Animation
Dec 25 HTML / CSS
基于HTML5 Canvas 实现弹出框效果
Jun 05 HTML / CSS
简单介绍HTML5中的文件导入
May 08 HTML / CSS
HTML5之消息通知的使用(Web Notification)
Oct 30 HTML / CSS
详解window.open被浏览器拦截的解决方案
Jul 18 HTML / CSS
Canvas环形饼图与手势控制的实现代码
Nov 08 HTML / CSS
AmazeUI导航的示例代码
Aug 14 HTML / CSS
萌新HTML5 入门指南(二)
Nov 09 HTML / CSS
CSS3 制作的彩虹按钮样式
Apr 11 HTML / CSS
详解HTML5常用的语义化标签
Sep 27 #HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
Mar 26 #HTML / CSS
HTML5 Canvas实现放大镜效果示例
Mar 25 #HTML / CSS
HTML5 图片预加载的示例代码
Mar 25 #HTML / CSS
html2canvas截图空白问题的解决
Mar 24 #HTML / CSS
html5视频常用API接口的实战示例
Mar 20 #HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
Mar 19 #HTML / CSS
You might like
php解析xml方法实例详解
2015/05/12 PHP
php实现中文转数字
2016/02/18 PHP
php微信支付接口开发程序
2016/08/02 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
深入理解Promise.all
2018/08/08 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
HTML的form表单和django的form表单
2019/07/25 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
计算机网络专业推荐信
2013/11/24 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
委托书范文
2014/04/02 职场文书
企业法人代表任命书
2014/06/06 职场文书
单位租房协议书样本
2014/10/30 职场文书
作弊检讨书
2015/01/27 职场文书
教育教学读书笔记
2015/07/02 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
全新239军机修复记
2022/04/05 无线电
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏