H5 唤起 APP的解决方案
H5 页面唤起APP或跳转到下载APP的某个链接地址。总结如下:
在 IOS 中, 系统版本在 8 以下时,可以监听页面的 pagehide / visibilitychange 事件。 系统版本大于 8 以后,可以使用 universal Link 或 URL scheme 进行跳转。
// IOS 的唤起function vForIOS(urlScheme, storeURL, fallback, universalLink) { var tid = deferFallback(TIMEOUT_IOS, storeURL, fallback); if (parseInt(os.version, 10) < 8) { bindPagehideEvent(tid); } else { bindVisibilityChangeEvent(tid); } if (parseInt(os.version, 10) > 8 && os.name == 'iOS') { // 通过universalLink if (universalLink === undefined) { universalLink = urlScheme; } else { clearTimeout(tid); } vLocation(universalLink); } else { vIframe(urlScheme); }} |
在安卓中, 安卓版本 4.4.4 以上机型的安卓自带浏览器、chrome 浏览器,需要通过 intent 跳转 【详情请见 https://developer.chrome.com/multidevice/android/intents】,其他浏览器大多数可通过 url scheme 唤起。但由于唤起APP后浏览器并无回调事件,我们很难判断是否已成功拉起APP,比较通用的解决办法是判断计时器是否变慢,若APP启动浏览器最小化入后台将会导致计时器变慢,即为实际事件间隔大于理想时间间隔。若未变慢则判断为未成功拉起APP,则跳转至下载地址。此判断代码如下:
function deferFallback(timeout, storeURL, fallback) { var clickedAt = new Date().getTime(); return setTimeout(function () { var now = new Date().getTime(); if (isPageVisible() && now - clickedAt < timeout + INTERVAL) { fallback(storeURL); } }, timeout); } |
安卓系统中,不同浏览器对唤起APP有严重的兼容性问题,主要处理方案有以下几种:
- 通过改变 window.location.href
- 通过创建 iframe 并为其 src 赋值
- 通过 intent
- 通过制造不可见 a 链接,并触发点击时间
// 打开页面的方式可能 // 1. 通过改变location function vLocation(urlScheme) { window.location.href = urlScheme; } // 2. 通过ifreame function vIframe(urlScheme) { setTimeout(function () { var iframe = createHiddenIframe('appLauncher'); iframe.src = urlScheme; }, 100); } // 3. 通过intent function vIntent(launchURI) { if (browser.name == 'Chrome') { move(); } else { setTimeout(move, 100); } function move() { // window.top.location.href = launchURI; window.location.href = launchURI } } // 3. 通过添加出发alink function vAlink(launchURI) { var aLink = document.createElement("a"); aLink.setAttribute("href", launchURI); aLink.style.display = "none"; document.body.appendChild(aLink); var event = document.createEvent("HTMLEvents"); event.initEvent("click", !1, !1); aLink.dispatchEvent(event) } // IOS 中的 可见性事件 function bindPagehideEvent(tid) { window.addEventListener('pagehide', function clear() { if (isPageVisible()) { clearTimeout(tid); window.removeEventListener('pagehide', clear); } }); } function bindVisibilityChangeEvent(tid) { document.addEventListener('visibilitychange', function clear() { if (isPageVisible()) { clearTimeout(tid); document.removeEventListener('visibilitychange', clear); } }); } function isPageVisible() { var attrNames = ['hidden', 'webkitHidden']; for (var i = 0, len = attrNames.length; i < len; i++) { if (typeof document[attrNames[i]] !== 'undefined') { return !document[attrNames[i]]; } } return true; } |
已知的浏览器兼容问题:
- 上述 chrome 和 Android Browser 可以使用 intent 的方式拉起 app
- QQ 浏览器 无法正确判断计时器是否变慢
- 微信浏览器 和 百度浏览器 无法唤起 app 除非加入其白名单
- 安卓4.4.4以前的 UC浏览器无法正确识别为 【安卓系统】需要单独设置判断条件
另: 研究京东唤起APP的代码时,其对百度浏览器做了如下操作,但我们对此的尝试并为成功,如下为其代码, 希望对后续研究此项的同学有帮助 :
function ai(aA) { var aD = ay(aA, true); var aB = aA.universalLinksUrl + "/ul/ul.action?" + aD; if (navigator.userAgent.indexOf("baidubrowser") >= 0) { window.location.href = aB } else { var az = document.createElement("a"); az.setAttribute("href", aB); az.style.display = "none"; document.body.appendChild(az); var aC = document.createEvent("HTMLEvents"); aC.initEvent("click", !1, !1); az.dispatchEvent(aC) }} |
H5 唤起 APP的解决方案的更多相关文章
- H5唤起app
H5唤起app 1.判断是否在微信中打开 无论是在哪个平台的客户端Android/IOS,在微信的平台上访问都有一个问题,那就是无法启动客户端,这是微信为了安全性考虑的限制,android这边屏蔽sc ...
- h5唤起APP并检查是否成功
// 检查app是否打开 function checkOpen(cb) { const clickTime = +(new Date()); function check(elsTime) { if ...
- h5 唤起app或跳转appStore
//唤起app通过唤端媒介(URL Scheme) //微信浏览器自6.3.x版本起禁用了大多数Scheme跳转功能,扫一扫目前可用 // URL 的组成: // [scheme:][// ...
- H5及微信中唤起app的解决方案
今天我们就来说说这个callapp-lib 我的接到的需求大概是这样的 如果检测到不是在app里面用webview打开的页面就会显示上面的立即打开按钮, 点击的话会判断是否在微信中, 如果在微信中打开 ...
- js在微信、微博、QQ、Safari唤起App的解决方案
首先看下完整的流程: 简单说下universal link 在iOS9之前,唤起方式和现在安卓是一个的,都是使用scheme进行唤起,这种方式有个小问题,每次唤起,都会给个提示:是否打开xx应用,这样 ...
- H5唤起APP一些坑
$(function () { function _openAppUrl(appUrl){ var ua = navigator.userAgent.toLocaleLowerCase(), open ...
- H5如何实现唤起APP
前言 写过hybrid的同学,想必都会遇到这样的需求,如果用户安装了自己的APP,就打开APP或跳转到APP内某个页面,如果没安装则引导用户到对应页面或应用商店下载.这里就涉及到了H5与Native之 ...
- 简话h5唤起本地app
在没接触这个功能之前,查询各种文档后也只是似懂非懂,做过之后,发现其实很简单,简言之就是通过一个iframe或者a标签来跳转app端提供的URL schema(至于这个URL schema的组成格式, ...
- 如何应用前端技术唤起app及判断用户来源及与原生交互的原理
做唤起时需要native端进行配合, h5唤起app这种需求是常见的.在移动为王的时代,h5在app导流上发挥着重要的作用. 目前我们采用的唤起方式是url scheme(iOS,Android平台都 ...
随机推荐
- LeetCode(123):买卖股票的最佳时机 III
Hard! 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必 ...
- C++ 关闭显示器
好困,想躺一下,关灯.上床,笔记本的屏幕还亮着,好刺眼,睡不着! 脑子里出现一个疑问,怎么用C++写一个关闭屏幕的小程序呢? 参考了网上已有的例子,最简化: #include <windows. ...
- JS实现继承的几种方式(转)
转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...
- C++ Primer 笔记——动态数组
1.动态数组定义时也需要指明数组的大小,但是可以不是常量. int i; int arr[i]; // 错误,数组的大小必须为常量 int *p = new int[i]; // 正确,大小不必是常量 ...
- ubuntu下配置反向代理
1. 环境 ubuntu:Ubuntu 13.04 x86-64 apache2: 2.2.22-6ubuntu5.1 amd64 2. 配置 2.1 配置应用 增加监听端口 打开/etc/apac ...
- ecilpse运行Servlet程序是找不到路径的原因
当工作空间路径有空格时,空格会被转成%20,将导致路径无法识别,于是就找不到路径了.
- mysql 5.7 安装
linux(CentOS6.7) 环境Mysql 5.7.17安装教程分享给大家,供大家参考,具体内容如下: 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/us ...
- 从零开始学C#——数据类型(三)
C#数据类型 在C#中,变量分为以下几种类型: 值类型 引用类型 指针类型 值类型 值类型变量可以直接分配给一个值,他们是从类System.ValucTpyc中派生. 值类型直接包含数据,比如int. ...
- 安装和强行卸载fuse
先卸载 yum list fuse yum --setopt=tsflags=noscripts remove fuse.x86_64 安装 yum install automake gcc-c++ ...
- 第k个互质数(二分 + 容斥)
描述两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列. 输入 输入m ,k (1<=m<=1000000;1<= ...