irpas技术客

H5APP_攻城狮深巷

网络 3069

H5app

手机现在是互联网的最大入口。

截至2021年6月,我国手机网民规模10.07亿,较2020年12月新增手机网民2092万,网民中使用手机上网的比例为99.6%。

参考链接:

H5 手机 App 开发入门:概念篇

H5 手机 App 开发入门:技术篇

一、H5 的含义

表面上看,手机 App 都是同样的东西,就是手机上的应用程序,点击图标就能运行,但是它们的底层技术不一样。按照开发技术,App 可以分成三大类。

原生应用(native application,简称 native App)Web 应用(web application,简称 Web App)混合应用(hybrid application,简称 hybrid App)

这三类 App 的技术模型都不一样,各有优缺点。企业一般会选择其中一种作为主要技术栈,构建自己的手机 App。

H5 这个词,可以理解成就是混合 App 模型,只不过它特指混合 App 的前端部分。 因为混合 App 的前端就是 HTML5 网页,所以简称 H5。这个词是国内独有的,基本上都是前端程序员在用,国外不用这个词,就直接叫混合 App。

真正理解 H5 开发,需要先搞清楚什么是原生 App、什么是 Web App,因为混合 App 是在它们的基础上诞生的。

二、原生应用 2.1 概念

原生 App 是专门为特定手机平台开发的应用程序 ,无法在其他平台运行。一个手机软件如果要同时支持苹果手机和安卓手机,就需要为它们各写一个原生 App。

历史上,原生 App 最早出现,跟智能手机系统一起诞生。2007年6月 iPhone 诞生,2008年9月安卓诞生,就同时发布了自家平台的原生 App 开发方法。

原生 App 使用与手机操作系统相同的语言。iOS 的原生 App 使用 Objective-C 语言或 Swift 语言,安卓使用 Java 语言或 Kotlin 语言。由于跟底层系统的语言和技术模型一致,所以原生 App 的性能和用户体验都很好。

2.2 优点

原生 App 的优点主要是两个:(1)较好的性能和体验;(2)可以使用系统的所有硬件和软件 API,比如 GPS、摄像头、麦克风、加速计、通知推送等等,能充分发挥系统的潜力。

2.3 缺点

原生 App 的缺点主要是成本,每个手机平台都要建立一个独立的开发团队,大公司一般都有 iOS 和安卓两个开发团队。如果出现第三个平台(以前的 Windows Phone,华为鸿蒙 OS),就要组建第三个团队,成本就更高。

第二个缺点是,原生 App 使用底层操作系统的语言,都是很重的编译型语言,开发和调试成本相对较高,时间周期长。

第三个缺点是,原生 App 必须下载安装才能使用,只要升级版本,就必须重新下载安装。用户往往不愿意更新版本,厂商被迫不得不长期支持很久以前的旧版本。

三、Web 应用 3.1 概念

Web App 是使用网页做的应用程序,必须在浏览器中使用。 比如,你在浏览器中收发邮件,就是在使用 Web App。

Web App 主要使用网页技术,即 HTML、JavaScript 和 CSS。2008年,w3c 组织发布了 HTML 第5版,简称 HTML 5,该版本大大增强了网页的功能,使得网页可以当作应用程序使用,而不仅仅是展示文字和图片,这就是 Web App 的由来。

3.2 优点和缺点

Web App 的优点是:(1)不需要下载安装,打开浏览器就能使用,而且总是使用最新版本;(2)对于开发者来说,Web App 写起来比较快,调试容易,不需要应用商店的批准就能发布。

Web App 的主要缺点有两个。首先,浏览器提供的 API(即 Web API)很有限(目前只有相机、GPS、电池等少数几个),大部分系统硬件都不能通过网页访问,也无法直接读取硬盘文件,所以 Web App 无法充分利用平台的硬件。

第二个缺点是,网页通过浏览器渲染,性能不如原生 App,不适合做性能要求较高的页面。

3.3 Web App 的劣势

Web App 需要打开浏览器才能使用,这意味着,用户必须记住如何导航到它,要么直接输入网址,要么翻找书签。这使得进入 Web App,远不如原生 App 方便。这点很致命,事实表明,用户偏好原生 App。

谷歌曾经调查了原生 App 和 Web App 各一千个,发现 Web App 可以覆盖更多的用户(1100万 vs 400万),但是原生 App 的用户使用时间(188分钟)远超 Web App(9分钟)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z71H6498-1635664439065)(https://·/blogimg/asset/201912/bg2019120307.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lTdzEEB-1635664439078)(https://·/blogimg/asset/201912/bg2019120308.jpg)]

另一项调查发现,用户87%的时间用在原生 App,13%的时间用在 Web App。由于这个原因,企业很少开发 Web App,都把原生 App 当作首选。

但是,Web App 也不是毫无竞争力。根据调查,普通用户每月平均使用27个原生 App,但访问了100多个手机网站。这意味着,用户的 App 使用时间都被头部 App 占据了,小公司的 App 使用频率非常低,获客成本极高,最终变成僵尸 App。因此,小公司开发 Web App 更划算,不仅成本低,而且可以服务更多的用户,以及更好地宣传自己(可以被搜索引擎收入)。

3.4 PWA

为了推广 Web App,谷歌公司的 Chrome 浏览器团队做了很多努力。他们认为,Web App 足以满足大多数 App 的需求,但是三大缺陷阻碍它的推广。

不能从手机的首屏直接进入。缺乏手机状态栏和锁屏时的通知推送能力。不支持脱机访问(即断网也能使用)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSVZ2Fge-1635664439084)(https://·/blogimg/asset/201912/bg2019120801.jpg)]

为了解决这些问题,Chrome 团队开发了新技术"渐进式 Web App"(Progressive Web App,缩写 PWA)。它可以把网站缓存在手机里面,供离线时使用,还能在手机首屏生成图标,直接点击进入,并且有通知推送能力,也不带有浏览器的地址栏和状态栏,跟原生 App 的使用体验非常接近。

但是,PWA 需要浏览器访问一次网站,才能在首屏生成图标,并且目前 iOS 系统的支持还不够理想,所以还只是一项探索性质的技术,迄今为止缺乏足够的成功案例。

四、混合应用 4.1 概念

混合 App (hybrid App)顾名思义就是原生 App 与 Web App 的结合。它的壳是原生 App,但是里面放的是网页。 可以理解成,混合 App 里面隐藏了一个浏览器,用户看到的实际上是这个隐藏浏览器渲染出来的网页。

混合 App 的原生外壳称为"容器",内部隐藏的浏览器,通常使用系统提供的网页渲染控件(即 WebView 控件),也可以自己内置一个浏览器内核。结构上,混合 App 从上到下分成三层:HTML5 网页层、网页引擎层(本质上是一个隔离的浏览器实例)、容器层。

4.2 API Bridge

混合 App 里面的网页不同于普通网页,可以调用底层系统所有的 API。奥秘就在于外层容器提供了 API Bridge,充当底层 API 的中介,允许内部的网页调用底层。

所谓 API Bridge 就是容器在底层接口和网页之间,建立一座桥梁,让双方通信。容器一旦接到网页的请求,就根据请求去调用底层系统的 API,然后再返回结果给网页。API Bridge 往往以 JavaScript 语言提供,方便网页调用,这时又称为 JSbridge。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpxc9xug-1635664439096)(https://·/blogimg/asset/201912/bg2019120802.jpg)]

不同容器的 API Bridge 是不一样的。为某个容器写的网页,不能放在另一个容器使用,也无法在浏览器使用,除非网页脚本做了兼容处理。

容器提供的 API Bridge 必须跟着平台更新。比如,iOS 发了新版本,有了新的硬件 API,容器也必须跟着推出新版的 API Bridge。如果容器没有跟上,开发者为了使用新的硬件,就只能想办法自己来写缺失的 API Bridge。

4.3 优点

混合 App 同时具有原生 App 和 Web App的优点,又可以避免它们的一些缺点。具体来说,可以总结为三点。

(1)跨平台

Web 技术是跨平台的,开发者只写一次页面,就能支持多个平台。也就是说,混合 App 只需要一个团队就够了,开发成本较低。

(2)灵活性

混合 App 的灵活性大,很容易集成多种功能。一方面,混合 App 很容易加载外部的 H5 页面,实现 App 的插件结构;另一方面,Web 页面可以方便地调用外部的 Web 服务。

(3)开发方便

Web 页面的调试和构建,远比原生控件简单省时。页面的更新也容易,只要在服务器上发布新版本,触发容器内更新就可以了。另外,Web 开发人员也比较容易招聘,传统的前端程序员可以承担开发任务。

4.4 缺点

混合 App 的主要缺点是,由于存在网页引擎的中间层,所以性能比较欠缺,不仅不如原生 App,而且由于 WebView 不是全功能浏览器,可能比 Web App 都要慢一些。

另一个缺点是,由于页面跨平台,就无法使用只有特定平台提供的功能,导致体验不如纯的原生 App。举例来说,早期的时候,安卓有物理的后退按钮,iPhone 没有,页面设计不得不考虑这一点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-51BQBEFI-1635664439104)(https://·/blogimg/asset/201912/bg2019120311.jpg)]

上图是 iOS 页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWhpVkej-1635664439113)(https://·/blogimg/asset/201912/bg2019120310.jpg)]

上面是安卓页面,左上角的后退按钮,跟系统的后退按钮重复了。

4.5 小程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jn40TZMH-1635664439120)(https://·/blogimg/asset/201912/bg2019120803.jpg)]

所谓小程序,可以看作是针对特定容器的 H5 开发。微信本身是一个容器,开放自己的接口(JSbridge),外部开发者使用规定的语法,编写页面,容器可以动态加载这些页面。

小程序对于官方的好处是,扩展了功能和应用场景,吸引外部开发者加入,繁荣了生态。对于外部开发者的好处是,有了流量入口,可以直接调用平台的各种功能(比如支付)。

五、手机 App 的技术栈

手机 App 的技术栈可以分成三类。

(1)原生 App 技术栈 (native technology stack)

原生技术栈指的是,只能用于特定手机平台的开发技术。比如,安卓平台的 Java 技术栈,iOS 平台的 Object-C 技术栈或 Swift 技术栈。

这种技术栈只能用在一个平台,不能跨平台。

(2)混合 App 技术栈 (hybrid technology stack)

混合技术栈指的是开发混合 App 的技术,也就是把 Web 网页放到特定的容器中,然后再打包成各个平台的原生 App。所以,混合技术栈其实是 Web 技术栈 + 容器技术栈,典型代表是 PhoneGap、Cordova、Ionic 等框架。

如果已经掌握了 Web 技术,这个技术栈就主要学习容器提供的 API Bridge,网页通过它们去调用底层硬件的 API。

(3)跨平台 App 技术栈 (cross-platform technology stack)

跨平台技术栈指的是使用一种技术,同时支持多个手机平台。它与混合技术栈的区别是,不使用 Web 技术,即它的页面不是 HTML5 页面,而是使用自己的语法写的 UI 层,然后编译成各平台的原生 App。

这个技术栈就是纯粹的容器技术栈,React Native、Xamarin、Flutter 都属于这一类。学习时,除了学习容器的 API Bridge,还要学习容器提供的 UI 层,即怎么写页面。

(4)小结

H5 开发主要用在混合技术栈。但是,跨平台技术栈的某些容器也会用到(比如 React Native),因为它们的 UI 层借鉴了 Web 模型。

另外,混合技术栈和跨平台技术栈的基础,都是原生技术栈,因为最终都要编译成原生App。所以,不管使用哪一种技术栈,多多少少要了解一些各平台的原生技术。

六、WebView 控件

讲解具体的技术栈之前,大家需要知道,不管什么技术,最终在 App 里面显示网页,一定需要一个网页引擎,这样才能解析网页。

通常情况下,App 内部会使用 WebView 控件作为网页引擎。这是系统自带的控件,专门用来显示网页。应用程序的界面,只要放上 WebView,就好像内嵌了浏览器窗口,可以显示网页。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krUqe3cs-1635664439126)(https://·/blogimg/asset/201912/bg2019121404.jpg)]

不同的 App 技术栈要显示网页,区别仅仅在于怎么处理 WebView 这个原生控件。

原生技术栈:需要开发者自己把 WebView 控件放到页面上。混合技术栈:页面本身就是网页,默认在 WebView 中显示。跨平台技术栈:提供一个 WebView 的语法,编译的时候将其换成原生的 WebView。

注意,不同系统的 WebView 控件名称不一样,安卓系统就叫 WebView,iOS 系统有较老的 UIWebView,也有较新的 WKWebView,作用都是一样的,差异在于功能的强弱。

七、原生技术

原生技术栈分成 iOS 和安卓两个平台。

简单说,iOS 的原生技术栈就是使用 Object-C 语言或 Swift 语言,在 Xcode 开发环境中编程。安卓的原生技术栈,则是使用 Java 语言或 Kotlin 语言,开发环境是 Android Studio。

八、混合技术

上面的原生技术栈需要自己新建 WebView 实例,相比之下,混合技术栈就简单多了。因为页面就是网页,所以容器已经设置好了 WebView,开发者直接写页面即可。

混合技术栈的各种容器框架之中,历史最悠久是 PhoneGap,诞生于2009年。后来在2011年被 Adobe 公司收购,改名为 Adobe PhoneGap。Adobe 公司将 PhoneGap 的核心代码,后来都捐给了 Apache 基金会,作为一个全新的开源项目,名为 Apache Cordova。后来,其他人也开始基于 Cordova 封装自己的框架,所以市场上有许多基于 Cordova 的开源框架,比较著名的有 Ionic、Monaca、Framework7 等。 九、跨平台技术栈

上面的混合技术栈使用 HTML 语言编写页面,再用 WebView 控件加载页面,所以只写一次页面,就能支持多个平台。跨平台技术栈也能做到多平台支持,但是原理完全不同。

跨平台技术栈的框架,都是使用自己的语法编写页面,不使用 Web 技术,编译的时候再将其转为原生控件,或者使用自己的底层控件,生成原生 App。这样就完全解决了 Web 页面性能不佳的问题。下面介绍三个这样的框架。

React Native: 使用 JavaScipt 语言编写页面Xamarin:使用 C# 语言编写页面Flutter:使用 Dart 语言编写页面 5.1 React Native

(1)原理

2013年, Facebook 公司发布了 React 框架。这个框架是为网页开发设计的,核心思想是在网页之上,建立一个 UI 的抽象层,所有数据操作都在这个抽象层完成(即在内存里面完成),然后再渲染成网页的 DOM 结构,这样就提升了性能。

很快,工程师们就意识到了,UI 抽象层本质上是一种数据结构,与底层设备无关,不仅可以渲染成网页,也可以渲染成手机的原生页面。这样的话,只要写一次 React 页面,就能分别编译成 iOS 和安卓的原生 App。这就是 React Native 项目的由来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tOzw2vOv-1635664439132)(https://·/blogimg/asset/201912/bg2019121302.jpg)]

注意,React Native 虽然也使用 JavaScript 语言,并且写法看上去像 Web 页面,但其实所有控件都是自己定义的,编译时再一一翻译为对应的原生控件。举例来说,React Native 的文本渲染控件是<Text>,翻译成 iOS 控件为UIView,翻译成安卓控件为TextView。这种做即保证了性能,又做到了跨平台支持,所以一诞生就引起开发者的关注,成了热门技术。

还有一个 NativeScript 框架,跟 React Native 很像,也是使用 JavaScript 语言,然后编译成原生控件。不过,它的开发模型是基于 Angular.js,而不是 React。

(2)React Native 的问题

React Native 的想法虽然很美好,但是实际开发中出现了各种各样的问题。

最主要的一个问题是, UI 抽象层翻译出来的 iOS 和安卓原生页面,做不到完全一致,尤其是复杂页面,样式或功能存在差异。编译出来两个平台的原生 App 往往是一个正常,另一个会出现各种奇怪的小毛病。React Native 的底层还是没有做到无缝适配,它至今没有发布 1.0 版(2019年底是 0.61 版),这多多少少也说明了一些问题。

如果你想用 React Native 做到 iOS 和安卓体验一致,并且充分发挥原生控件的功能,就需要同时熟悉 React Native、iOS、安卓三个平台,这对开发者的要求实在太高了。Airbnb 公司在使用 React Native 两年后,宣布放弃,改用原生技术栈。他们写了一篇很长的文章,解释为什么这么做,React Native 到底有什么问题,大家可以参考那篇文章。

9.2 Flutter

Flutter 是谷歌公司最新的跨平台开发框架。它为了解决 React Native 的平台差异问题,采用了一个完全不同的方案。

它自己实现了一套控件。打包的时候,会把这套控件打包进每一个 App,因此不存在调用原生控件的问题。不管什么平台,都调用内嵌的自己那套控件,就能做到 iOS 和安卓体验完全一致。

Flutter 历史还不长,应用还不广泛,API 也没稳定下来。但是很值得关注。

9.3 uniapp

uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、微信小程序等多个平台,保证其正确运行并达到优秀体验。

uni-app 继承自 Vue.js,提供了完整的 Vue.js 开发体验。

uni-app 组件规范和扩展api与微信小程序基本相同。

有一定 Vue.js 和微信小程序开发经验的开发者可快速上手 uni-app ,开发出兼容多端的应用。

uni-app提供了条件编译优化,可以优雅的为某平台写个性化代码、调用专有能力而不影响其他平台。

uni-app打包到App时仍然使用了5+引擎,5+的所有能力都可以在uni-app中可以使用。在App端运行性能和微信小程序基本相同。

对于技术人员而言:不用学那么多的平台开发技术、研究那么多前端框架,学会基于vue的uni-app就够了。 对于公司而言:更低成本,覆盖更多用户,uni-app是高效利器。

十、如何辨别app是原生开发的还是h5开发的、或是混合开发?

android平台下,打开开发者选项,打开显示布局边界

有布局的部分就是naive 12306这样的显然是h5 十一、总结

通过上面的介绍,希望大家已经了解了各种技术栈的特点。

(1)原生技术栈的技能和体验最好,对于复杂的大型 App,如果条件允许,应该采用这种方式开发。

(2)混合技术栈的成本低,灵活性好,对性能要求不高的简单 App,尤其是纯展示性的页面,可以采用这种方式开发。

(3)跨平台技术栈适用于,存在外部或内部条件的限制,只有一个团队开发跨平台 App 的情况。

我是攻城狮深巷,欢迎关注我的博客:Deep Lane’s Blog和Github:shenxiang216,一起学习更多技术!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #h5app #参考链接H5 #手机 #APP #开发入门概念篇H5