html5唤起app的方法


Posted in HTML / CSS onNovember 30, 2017

h5唤起app这种需求是常见的。在移动为王的时代,h5在app导流上发挥着重要的作用。

目前我们采用的唤起方式是url scheme(iOS,Android平台都支持),只需原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP。

三种唤起方案

iframe

var last = Date.now(),
    doc = window.document,
    ifr = doc.createElement('iframe');

//创建一个隐藏的iframe
ifr.src = nativeUrl;
ifr.style.cssText = 'display:none;border:0;width:0;height:0;';
doc.body.appendChild(ifr);

setTimeout(function() {
    doc.body.removeChild(ifr);
    //setTimeout回小于2000一般为唤起失败 
    if (Date.now() - last < 2000) {
        if (typeof onFail == 'function') {
            onFail();
        } else {
            //弹窗提示或下载处理等
        }
    } else {
        if (typeof onSuccess == 'function') {
            onSuccess();
        }
    }
}, 1000);

iframe方案的唤起原理是: 程序切换到后台时,计时器会被推迟(计时器不准的又一种情况)。如果app被唤醒那么网页必然就进入了后台,如果用户从app切回来,那么时间一般会超过2s;若app没有被唤起,那么网页不会进入后台,setTimeout基本准时触发,那么时间不会超过2s。

window.location.href直接跳转

window.location.href = nativeUrl;

a标签唤起

<a href="nativeUrl">唤起app</a>

三种唤起方案的浏览器测试

  1. X表示唤起失败,√表示唤起成功
  2. 红色标记表示进入页面直接唤起,绿色表示人工事件操作后唤起
  3. ios测试机:iphone 6p;android测试机:小米1s

iframe唤起app测试结果

html5唤起app的方法

window.location.href唤起app测试结果

html5唤起app的方法

a标签唤起app测试结果

html5唤起app的方法

iframe和window.location.href唤起对比

html5唤起app的方法

iframe、window.location.href和a标签唤起三者对比

html5唤起app的方法

测试结果分析

首先测试的机型和浏览器有限,上述结果仅作参考.

对比iframe唤起和location.href,我们可以发现:

  1. 对于ios来说,location.href跳转更合适,因为这种方式可以在Safari中成功唤起app。Safari作为iphone默认浏览器其重要性就不用多说了,而对于微信和qq客户端,ios中这两种方式都没有什么卵用==
  2. 对于Android来说,在进入页面直接唤起的情况下,iframe和location.href是一样的,但是如果是事件驱动的唤起,iframe唤起的表现比location.href要更好一点。
  3. 通过测试可以发现,进入页面直接唤起和事件驱动的唤起,对于很多浏览器,两者的表现是不同的,简单来说,直接唤起的失败更多。

通过上述对比分析,Android使用iframe唤起,ios采用window.location.href唤起更合适一点。

进入页面直接唤起和事件驱动唤起的区别

这两种唤起场景在Android中有明显的区别,无论是iframe的方式唤起还是location.href,以小米1s的chrome为例:

<a id="goApp" href="javascript:void(0);">点我打开APP</a>

绑定事件 人工驱动唤起:

//成功唤起
window.onload = function () {
    $('#goApp').on("click", function () {
        window.lib.callapp("nativeUrl");//iframe
        //window.location.href = nativeUrl;
    });
};

进入页面直接唤起:

//唤起失败
window.onload = function () {
    window.lib.callapp("nativeUrl");//iframe
    //window.location.href = nativeUrl;
};

绑定事件,js唤起

//唤起失败
window.onload = function () {
    $('#goApp').on("click", function () {
        window.lib.callapp("nativeUrl");//iframe
        //window.location.href = nativeUrl;
    });

    $('#goApp).trigger('click');
};

原本我以为$('#goApp).trigger('click');的方式和人工点击是一样的,而实际表现是,js触发事件的表现和页面直接跳转一样无效。

从参考的博文中看到 Android平台和各个app厂商差异很大,比如Chrome从25及以后就不再支持通过js触发(非用户点击),设置iframe src地址等来触发scheme跳转。所以js触发和直接用户点击区别还是很大的,跟音频播放的限制异曲同工吧。

最后

经过上述的测试和分析,基本敲定ios用window.location.href的方式唤起比较合适,Android用iframe唤起比较合适。我们在使用iframe唤起时,一般对唤起失败的处理是直接下载,但是这里就有一个问题,就是浏览器无法检测到唤起是否成功,即,如果我唤起成功后返回浏览器,浏览器还是会弹出下载信息,这个体验很差。当然我们也需要处理一些成功或失败的回调函数,说不定我们的场景只需要唤起而并不需要失败后的下载呢。

关于使用location.href唤起iphone手机上的原生app,跳转中间页的处理方式可能也比当前页直接处理更好一点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3中的clip-path使用攻略
Aug 03 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
Sep 28 HTML / CSS
css3实现可拖动的魔方3d效果
May 07 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
Jun 01 HTML / CSS
css3弹性盒子flex实现三栏布局的实现
Nov 12 HTML / CSS
基于Canvas+Vue的弹幕组件的实现
Jul 23 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
Apr 10 HTML / CSS
关于html字符串正则判断和匹配的具体使用
Dec 12 HTML / CSS
使用css样式设计一个简单的html登陆界面的实现
Mar 30 HTML / CSS
纯CSS实现酷炫的霓虹灯效果
Apr 13 HTML / CSS
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
Apr 29 HTML / CSS
html5调用摄像头实例代码
Jun 28 HTML / CSS
Canvas与图片压缩的示例代码
Nov 28 #HTML / CSS
教你使用Canvas处理图片的方法
Nov 28 #HTML / CSS
HTML5打开手机扫码功能及优缺点
Nov 27 #HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
Nov 21 #HTML / CSS
HTML5响应式(自适应)网页设计的实现
Nov 17 #HTML / CSS
localStorage、sessionStorage使用总结
Nov 17 #HTML / CSS
html5实现移动端适配完美写法
Nov 16 #HTML / CSS
You might like
php读取msn上的用户信息类
2008/12/05 PHP
smarty中js的调用方法示例
2014/10/27 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
Java面向对象面试题
2016/12/26 面试题
学籍证明模板
2014/11/21 职场文书
会计工作能力自我评价
2015/03/05 职场文书
初三毕业感言
2015/07/31 职场文书