当前位置: 首页 > news >正文

Hybrid App 开发实践总结

引言

随着 Web 技术和移动设备的快速发展,Hybrid 技术已经成为一种最主流最常见的方案。一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能,同时也能拥有 Web技术 灵活的开发模式、跨平台能力以及热更新机制,想想是不是都鸡冻不已。。?。本系列文章是公司在这方面实践的一个总结!

Native App 开发模式

Native App,原生APP,使用原生(即Android或iOS)开发的APP。应用的性能好是无容置疑的,但是企业大都处于尝试和摸索期,企业需要在短时间内快速推出不同的功能、产品来适应市场的需求和变化。对于有专业开发团队的互联网公司而言推陈出新都是个难题,更不要说在企业中的应用。 其缺点有:

  1. 开发、更新、维护的周期太长
  2. 无法跨平台:Android和iOS都需要开发各自平台的版本——开发成本高;
  3. 升级麻烦:每次升级都要下载安装包,Android还好,反正不需要审核,下载就下载吧,但iOS就麻烦了,发布每个版本还得经过App Store的审核
  4. Android和iOS很难同步发布。

Web App 开发模式

HTML5技术的兴起给Web App注入了新的生机。可是Web App目前的本质是金玉其外败絮其中,功能不但无法和Native App媲美,用户体验更是众所周知的弊端。在当前iOS、Android系统主导的桌面入口的形态下,让用户打开浏览器,再访问某个网址,体验还不好,不人性化的体验与流程导致大量用户流失。

Hybrid App 开发模式

Hybrid App,俗称混合应用,即混合了 Native技术 与 Web技术 进行开发的移动应用。现在比较流行的混合方案主要有三种,主要是在UI渲染机制上的不同:

  1. 基于 WebView UI 的基础方案,市面上大部分主流 App 都有采用,例如微信JS-SDK、Cordova,通过 JSBridge 完成 H5 与 Native 的双向通讯,从而赋予H5一定程度的原生能力。
  2. 基于 Native UI 的方案,例如 React-Native、Weex。在赋予 H5 原生API能力的基础上,进一步通过 JSBridge 将js解析成的虚拟节点树(Virtual DOM)传递到 Native 并使用原生渲染。
  3. 另外还有近期比较流行的小程序方案,也是通过更加定制化的 JSBridge,并使用双 WebView 双线程的模式隔离了JS逻辑与UI渲染,形成了特殊的开发模式,加强了 H5 与 Native 混合程度,提高了页面性能及开发体验。

以上的三种方案,其实同样都是基于 JSBridge 完成的通讯层,第二三种方案,其实可以看做是在方案一的基础上,继续通过不同的新技术进一步提高了应用的混合程度。因此,JSBridge 也是整个混合应用最关键的部分!

技术选型

任何技术方案的选型,其实都应该基于使用场景和现有条件。基于公司现有情况的几点考虑,在方案一上进一步优化,更加适合我们的需求。

  1. 需求 Web技术 快速迭代、灵活开发的特点和线上热更新的机制。
  2. 产品的核心能力是强大的拍照、扫描二维码、图片上传等功能,因此单纯的 H5技术能做的事非常有限,不能满足需求,通过 Hybrid 技术来强化H5,便是一种必需。
  3. 公司业务上,并没有非常复杂的UI渲染需求,而且公司已经有一套完善的前端框架并且已经非常成熟,因此我们并不强需类似 RN 这样的方案。

结果:React Native 和 Cordova 针对跨平台应用有着不同的设计理念,也就迎合了不同的需求。Cordova 能够将已有的单页 Web 应用很方便的运行在不同设备上,代价是一些表现效果的损失。React Native 应用会更接近原生应用,但也会需要针对不同系统重新实现某些代码。由于我们有成熟的整套的前端开发框架,为了减少开发成本和额外的学习成本,我们采用了 cordova !

cordova架构示意图

  • Web App 层是开发人员编写代码的主要地方,应用程序以网页的形式呈现,在一个index.html的本地页面文件中引用所需要的各种Web资源,如CSS、JavaScript、图像、影音文件等。应用程序的配置保存在config.xml文件中。
  • WebView 层用来呈现用户界面,即web页面的展现。例如,在android平台是通过WebView控件实现web页面的呈现。
  • Plugins 主要用于在JavaScript代码中调用各平台native的功能。Cordova项目已经包含一些核心的plugin,如电池、摄像头、通讯录等。开发人员也可以开发自定义的plugin,来实现所需要的功能。其原理就是Native 获取 JavaScript环境上下文,并直接在上面挂载对象或者方法,使 js 可以直接调用,Android 与 IOS 分别拥有对应的挂载方式。

cordova 开发所用到的整体技术栈和开发环境

所用到的技术栈如下:

  • 系统环境 CentOS + Docker
  • 持续集成&持续交付 jenkins + git
  • nodeJs、npm、cordova、android环境、MySql数据库
  • 移动端热更新 code-push-cli + code-push-server 自己跑服务
  • 反向代理 Nginx

各个docker的职责划分

  • jenkins的docker负责编译cordova生成android的apk文件并将最新的静态资源上传至code-push-server
  • code-push-server的docker 负责资源更新
  • mysql数据库的docker 主要服务于code-push-server
  • git负责代码管理
  • nodeJs的docker负责提供下载jenkins编译后的的apk文件或者中间层代理(和java服务通信)或者服务于前端SSR首屏渲染

说明

如果将以上技术栈描述清楚需要不小的篇幅,所以我会将文章进行拆分:

1. 开篇(本文)
2. cordova的环境配置和创建第一个android App
3. 服务器端docker的安装,nginx、jenkins、git服务的架设
4. 服务器端code-push-server、mysql服务的架设
5. 客户端code-push插件的引入及code-push-cli的使用
7. 如何使用纯shell编写一个快速搭建开发者环境的命令行工具和安卓端真机调试

相关文章:

  • 小飞机工作笔记(二)追帧与快照同步
  • 配置 SSH 端口转发,并设置开机启动
  • JavaScript 笔记02
  • 四个措施打造安全的DevOps流程
  • WMI-Win32_PhysicalMemory 内存条参数
  • 天猫国潮行动:卡萨帝F+冰箱成高端主推产品
  • 常常忘记但是很重要的sql语句
  • 最完整的经纬度正则表达式
  • 数值优化(三)
  • 安装Windows10系统注意事项
  • java源码-HashMap
  • [HNOI2008]玩具装箱toy
  • pjsip uri demo
  • 【git】git入门之把自己的项目上传到github
  • LAMP架构(PHP5安装,PHP7安装)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • co.js - 让异步代码同步化
  • docker python 配置
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java IO学习笔记一
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Markdown 语法简单说明
  • MYSQL 的 IF 函数
  • Objective-C 中关联引用的概念
  • Octave 入门
  • Redis学习笔记 - pipline(流水线、管道)
  • sessionStorage和localStorage
  • 初识 webpack
  • 关于extract.autodesk.io的一些说明
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深入 Nginx 之配置篇
  • 听说你叫Java(二)–Servlet请求
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习Vue.js的五个小例子
  • 用Visual Studio开发以太坊智能合约
  • Prometheus VS InfluxDB
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #laravel 通过手动安装依赖PHPExcel#
  • #LLM入门|Prompt#3.3_存储_Memory
  • #微信小程序:微信小程序常见的配置传旨
  • (06)Hive——正则表达式
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (备忘)Java Map 遍历
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十一)c52学习之旅-动态数码管
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础1
  • (转)h264中avc和flv数据的解析
  • (转)iOS字体
  • .NET BackgroundWorker
  • .NET Framework与.NET Framework SDK有什么不同?