许久没有写博客了,最近有个H5启动APP原生页面的需求,中间遇上一些坑,看了些网上的实现方案,特意来总结下
一、需要判断客户端的平台以及是否在微信浏览器中访问
1、客户端判断
在启动APP时,Android和IOS系统处理的方式是不一样的,Android这边由于开放,可以在浏览器中通过标签以及meta标签的方式,让浏览器app获取手机打开应用的权限进而启动APP。
而在IOS这边,IOS9以后的系统,则可以在APP开发过程中加入配置和逻辑代码编写,系统在浏览器即将访问到某个域名前就把这个域名对应的APP打开,这个有点闪,封闭还是有封闭的好处。
所以首先要在客户端判断,是Android系统还是IOS系统,判断代码如下
function isInIos(){var userAgentInfo = navigator.userAgent , Agents = ["iPhone" , "iPad", "iPod"];for(var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) { return true; } }return false; }
2、是否在微信内置浏览器中
无论是在哪个平台的客户端Android/IOS,在微信的平台上访问都有一个问题,那就是无法启动客户端,这是微信为了安全性考虑的限制,android这边屏蔽schema协议,除非公司是微信的伙伴加入了白名单才能
使用,IOS系统可以去访问app对应appstore的下载页,但是微信经常屏蔽appstore的这个网址,进而访问不到。比较方便的做法就是在微信浏览器中,无论是IOS还是android都去应用宝的下载(IOS 这边最后会到
appstore中)页面打开。我这边的需求是提示用户点击“...”用默认浏览器打开。
判断是否是在微信中,代码如下:
function isInWx(){var agent = window.navigator.userAgent.toLowerCase();return agent.match(/MicroMessenger/i) == 'micromessenger'; }
二、原理
首先无论是andorid还是IOS端,在浏览器中通过JS都是无法判断该手机是否装有某APP的,即使这个浏览器有权限读取手机应用列表,也没有一个固定的对外API让咱们进行查询。而H5启动APP本质上是通过
URL scheme打开APP,一个APP可以设置一个或多个打开自己的URL scheme,浏览器去访问某一个APP的URL scheme,然后若系统安装有这个APP,则会请求权限去打开这个APP。其实也算是浏览器app
打开另一个app,iOS就可以使用 UIApplication 的 canOpenUrl 方法来检测URL scheme 是否能打开对应的APP,而android也是类似的方式。当然如果JS跳转URL scheme没有反应,也意味着这个手机没有
装这个app。
三、android平台
首先编辑AndroidManifest.xml,主要是增加第二个
<activity android:name=".activity.LoadingActivity" android:label="${APP_NAME}" android:screenOrientation="portrait" android:theme="@style/FirstActivityTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="android"android:scheme="wushang" /> </intent-filter></activity>
比如此处wushang就是scheme,这个最好是app的唯一标识符,要不然在H5唤醒时,会出现一个选择框,选择启动哪一个APP。而host表示启动该页面,其实这个更应该用com.android.sky这样的包名来替代更好。
这样的情况完整的URL就是wushang://android?data=sky,后面是参数传递。在Activity中可以用如下代码获取参数
public void onCreate(Bundle savedInstanceState) { Uri uridata = this.getIntent().getData(); String mydata = uridata.getQueryParameter("data"); }
之后在进行字符串截取还是什么鬼的都随意啦。
接下来来谈谈前端代码,这里有两种情况
1、页面在刷新进入时,请求权限唤起APP
这个比较简单,就只用在页面的顶部head中加入meta标签即可
<meta http-equiv="refresh" content="0;url=wushang://android?data=sky">
这个标注当页面刷新即去访问这个链接,进而启动APP。但是存在一个问题,如果是苹果系统的Safari浏览器的话,访问有这个meta的头,会给出错误提示,所以这个头部可以在后端进行页面渲染时通过客户端的
总类在加上去。
2、通过点击事件唤起APP
最简单的办法当然是直接使用a标签,如下
<a href="wushang://android">open Android app</a>
但是在实际使用时,是需要对客户端的平台类型还有是否在微信内置浏览器中进行判断的,所以这样的做法肯定是不行的。
接下来谈谈在开发过程中,遇到的一个问题,记录下。因为这边移动端使用的工具库库是zepto,采用的点击事件是tap,但是在用tap进行处理是经常要点很多下,才能唤起APP
<script type="text/javascript"> $('#go').tap(function(){ window.location.href = "wushang://android"; });</script>
具体原因不知,可能是tap事件采用的是轻点触碰。然后摸索了下,才用click事件,或者直接在a标签上标注处理函数就没有这问题
<a id="go" >open Android app</a><a href="javascript:startApp()"> open</a><script src="../res/lib/zepto.min.js?1.1.11"></script><script src="../res/lib/public.js?1.1.11"></script><script>$('#go').click(function () { if(publicFun.isIos()){ alert('it is IOS') }else{ window.location.href = "wushang://android"; } });function startApp(){ if(publicFun.isIos()){ alert('it is IOS') }else{ window.location.href = "wushang://android"; } }</script>
所以决定以后遇到这类问题,就用这两种方式了。下面是实际的处理函数
window.startApp = function(){ //启动APP if(publicFun.isInWx()){ //微信中alert("请在浏览器中打开"); }else{ //非微信中if(publicFun.isIos()){ //IOS系统,直接去itunes中,既可以下载也可以打开window.location.href = "https://itunes.apple.com/cn/app/[name]/id[id]"; }else{ //android系统,通过定时器的方式,判断是否安装有APPvar hasApp = true , t = 1000; setTimeout(function () { //没有安装APP则跳转至应用宝下载,延时时间设置为2秒 if(!hasApp) window.location.href = "http://a.app.qq.com/o/simple.jsp?pkgname=[name]"; } , 2000);var t1 = Date.now(); window.location.href = "wushang://android"; setTimeout(function () { //t的时间就是出发APP启动的时间,若APP启动了,再次返回页面时t2这行代码执行,hasApp即为true。反之若APP没有启动即为false var t2 = Date.now(); hasApp = !(!t1 || t2 - t1 < t + 150); } , t); } } }
其实有个非常简单的办法,就是直接跳转应用宝。无论是在android还是IOS,以及微信非微信。应用宝的下载页面都有下载和打开两个功能(如果是在IOS平台,它是通过连接app store的方式)
四、IOS平台
针对ios9及以上的打不开问题,实际上ios9提供了更好的解决方案————通用链接。
这是iOS9推出的一项功能,如果你的应用支持Universal Links(通用链接),那么就能够方便的通过传统的HTTP链接来启动APP(如果iOS设备上已经安装了你的app,不需要额外做任何判断等),或者打开网页(iOS设备上没有安装你的app)。或许可以更简单点来说明,在iOS9之前,对于从各种从浏览器,Safari、UIWebView或者 WKWebView中唤醒APP的需求,我们通常只能使用scheme。
以上来自网上关于通用链接的介绍,对于前端简单点讲就是你访问一个http的url,如果这个url带有你提交给开发平台的配置文件中匹配规则的内容,ios系统会去尝试打开你的app,如果打不开,系统就会在浏览器中转向你要访问的链接。很好的一个属性,因为通过这个属性在ios9上我们能够绕过微信的拦截从而打开app。
所以上面的点击事件,仅仅是去访问app store,因为若app已安装,在浏览器访问时,就已经去到APP中了。
这些都是IOS配置上的东西,就不多写了。至于传参,以及页面定向,其实也就是相当于在UIWebView中获取当前连接的URL,然后进行字符串拆分以及校验,即可判断去哪个页,以及获取参数值。
以上是H5启动APP原生页面的实例方法的详细内容。更多信息请关注PHP中文网其他相关文章!

H5通过多媒体支持、离线存储和性能优化提升网页用户体验。1)多媒体支持:H5的和元素简化开发,提升用户体验。2)离线存储:WebStorage和IndexedDB允许离线使用,提升体验。3)性能优化:WebWorkers和元素优化性能,减少带宽消耗。

HTML5代码由标签、元素和属性组成:1.标签定义内容类型,用尖括号包围,如。2.元素由开始标签、内容和结束标签组成,如内容。3.属性在开始标签中定义键值对,增强功能,如。这些是构建网页结构的基本单位。

HTML5是构建现代网页的关键技术,提供了许多新元素和功能。1.HTML5引入了语义化元素如、、等,增强了网页结构和SEO。2.支持多媒体元素和,无需插件即可嵌入媒体。3.表单增强了新输入类型和验证属性,简化了验证过程。4.提供了离线和本地存储功能,提升了网页性能和用户体验。

H5代码的最佳实践包括:1.使用正确的DOCTYPE声明和字符编码;2.采用语义化标签;3.减少HTTP请求;4.使用异步加载;5.优化图像。这些实践能提升网页的效率、可维护性和用户体验。

Web标准和技术从HTML4、CSS2和简单的JavaScript演变至今,经历了显着的发展。 1)HTML5引入了Canvas、WebStorage等API,增强了Web应用的复杂性和互动性。 2)CSS3增加了动画和过渡功能,使页面效果更加丰富。 3)JavaScript通过Node.js和ES6的现代化语法,如箭头函数和类,提升了开发效率和代码可读性,这些变化推动了Web应用的性能优化和最佳实践的发展。

H5不仅仅是HTML5的简称,它代表了一个更广泛的现代网页开发技术生态:1.H5包括HTML5、CSS3、JavaScript及相关API和技术;2.它提供更丰富、互动、流畅的用户体验,能在多设备上无缝运行;3.使用H5技术栈可以创建响应式网页和复杂交互功能。

H5与HTML5指的是同一个东西,即HTML5。HTML5是HTML的第五个版本,带来了语义化标签、多媒体支持、画布与图形、离线存储与本地存储等新功能,提升了网页的表现力和交互性。

H5referstoHTML5,apivotaltechnologyinwebdevelopment.1)HTML5introducesnewelementsandAPIsforrich,dynamicwebapplications.2)Itsupportsmultimediawithoutplugins,enhancinguserexperienceacrossdevices.3)SemanticelementsimprovecontentstructureandSEO.4)H5'srespo


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)