热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

h5页面检测手机是否安装app

通过H5检测是否安装过应用,来进行不同的判断(下载或者跳转到app中)。主要原理:创建一个iframe去打开uri。如果打开

通过H5检测是否安装过应用,来进行不同的判断(下载或者跳转到app中)。主要原理:创建一个iframe去打开uri。如果打开app成功,网页进入后台,再切换回来时间会超过2.5s。利用时间去检测。

具体实现的过程:

你可能遇到的问题:

1.什么是uri,获取uri需要哪些帮助?

2.安卓中应用切换到后台,计时器仍会不断运行怎么解决?

3.微信中不支持第三方uri,下载应用。怎么解决来完成跳转到自身app。

 

uri获取

这里的uri,指的就是通过Url scheme来实现的H5与安卓、苹果应用之间的跳转链接。

我们需要找到客户端的同事,来获取如下格式的链接。

-- xx://‘跳转页面’/‘携带参数’

url scheme的简单解释。

url就是平常理解的链接。

scheme是指url链接中的最初位置,就是上边链接中‘xx’的位置。

详细介绍可以看这里:使用url scheme详解:https://sspi.com/post/31500

 

用这个链接我们可以跳转到应用中的某个页面,并可以携带一定的参数。这个是我们实现这个功能的前提。

具体实现

1⃣️ 通过iframe打开app

Android平台中各个app厂商差异很大,比如Chrome从25及以后就不再支持通过js触发(非用户点击),所以我们使用iframe src地址等来触发scheme。

//再iframe中打开APP
var ifr=document.createElement('iframe');
ifr.src
=openUrl;
ifr.style.display
='none';

 

2⃣️判断是否安装某应用

 原理:若通过url scheme打开app成功,那么当前h5会进入后台,通过计时器会有明显延迟。利用时间来判断。

//检查app是否打开
function checkOpen(cb){var _clickTime=+(new Date());function check(elsTime){if(elsTime>3000||document.hidden||document.webkitHidden){cb(1);}else{cb(0); }} //启动间隔20ms运行的定时器,并检测累计消耗时间是否超过3000ms,超过则结束var _count=0,intHandle;intHandle=setInterval(function(){_count++;var elsTime=+(new Date())-clickTime;if(_count>=100||elsTime>3000){clearInterval(intHandle);check(elsTime); }},20);
}

 

注意:

  • 由于安卓手机,页面进入后台,定时器setTimeout仍会不断运行,所以这里使用setInterval,较小间隔时间重复多次。来根据累计时间判断。
  • cb为回调函数,根据返回0 or 1来判断是否安装。
  • document.hidden对大于4.4webview支持很好,为页面可见性api。

3⃣️ 微信中实现打开or下载应用效果

这里使用的是应用宝微链接实现。

if (callback) {//客户端检测微信直接跳应用宝链接var browser = BrowserInfo();//使用微链接var encodeUri = encodeURIComponent('你的uri');if (browser.isWeixin) {window.location.href = '你的微链url&android_schema='+encodeUri;}else{checkOpen(function(opened){callback && callback(opened);});}}

 

注意点:

  • 微链接是应用宝提供的,可以在后台获取。
  • 使用微链接必须做encodeURIComponent转义。
  • 链接地址在微链接后拼接一个android_schema参数加你的uri

完整函数

export const openApp = function(openUrl, callback) {//检查app是否打开function checkOpen(cb){var _clickTime = +(new Date());function check(elsTime) {if ( elsTime > 3000 || document.hidden || document.webkitHidden) {cb(1);} else {cb(0);}}//启动间隔20ms运行的定时器,并检测累计消耗时间是否超过3000ms,超过则结束var _count = 0, intHandle;intHandle = setInterval(function(){_count++; var elsTime = +(new Date()) - _clickTime;if (_count>=100 || elsTime > 3000 ) {clearInterval(intHandle);check(elsTime);}}, 20);}//在iframe 中打开APPvar ifr = document.createElement('iframe');ifr.src = openUrl;ifr.style.display = 'none';if (callback) {//客户端检测微信直接跳应用宝链接var browser = BrowserInfo();//使用微链接var encodeUri = encodeURIComponent(openUrl);if (browser.isWeixin) {window.location.href = '你的微链url&android_schema='+encodeUri;}else{checkOpen(function(opened){callback && callback(opened);});}}document.body.appendChild(ifr); setTimeout(function() {document.body.removeChild(ifr);}, 2000); }

 

函数中调用的BrowserInfo是一个简单的客户端检测。具体如下:

/**
* 客户端检测
*/
export const BrowserInfo
= function() {var json = {userAgent: navigator.userAgent.toLowerCase(),isAndroid: Boolean(navigator.userAgent.match(/android/ig)),isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)),isIpad: Boolean(navigator.userAgent.match(/ipad/ig)),isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)),}return json;
}

 

回调函数的使用

页面中可以通过传递回调函数,来获取返回值;并通过是否传这个参数来做进入页面检测。

转:https://www.cnblogs.com/zxyGo/p/6759797.html



推荐阅读
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文提供了一个详尽的前端开发资源列表,涵盖了从基础入门到高级应用的各个方面,包括HTML5、CSS3、JavaScript框架及库、移动开发、API接口、工具与插件等。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
author-avatar
holygame
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有