Cordova 代码热更新
[图片上传失败...(image-a19be7-1521624289049)]
基于 Cordova 框架能将网页应用 (js, html, css, 图片等) 打包成 App。当 App 在应用商店上架后,如何快速更新是我们需要考虑的问题。?
- 本地打包新版本 App 发布到应用商店,但这中发布流程耗费时间,尤其是 Apple Store
- 应用加载网络资源,这样 App 展示的内容就可以保证是最新的,但当应用断网时,应用就无法正常使用
我们能想的这两种方式都存在的很大的弊端,不适合实际应用!
插件 Cordova Hot Code Push (CHCP)
插件 Cordova Hot Code Push 正是针对 Cordava 应用如何快速更新问题而提供的解决方案,可以自动更新 web 相关的静态文件。
该插件提供了详细的 wiki 文档,请参考:wiki 文档
App Store 支持么
近日,苹果App Store审核团队向一些开发者下最后通牒:2017年6月12日之前移除所有热更新相关代码、框架或SDK,并重新提交版本。如果不作调整,App可能会从App Store下架。
苹果应用商店已经禁止使用类似 JSPatch 等热修复的框架或者SDK,那么这个插件提供的代码热更新功能是否违法这一规定呢? ?
? 答案是否定的!此插件提供的代码热更新是 web 静态文件,苹果是允许这一做法的。但有两点值得注意:
- ① 不能明显告知用户有新版本可用,询问用户是否需要更新到最新代码。这一做法会使用户产生困惑,这种更新方式和通过 App Store 更新有何区别。所以正确的做法是,在应用启动的时候,下载和安装热更新代码;或者在某个时机下载热更新代码,在应用下次打开时进行安装
- ② 如果通过此插件进行代码热更新后,应用功能发生巨大变化,譬如原来是一个计算器应用,代码热更新后,变成了一个音乐播放器,这种欺骗用户的做法也是会被苹果拒绝的
添加插件到项目中
1、下载插件
要求 Cordova 版本 5.0+
cordova plugin add cordova-hot-code-push-plugin --save
2、下载插件的命令行工具 cordova-hot-code-push-cli
npm install -g cordova-hot-code-push-cli
该命令行工具可帮助我们自动生成配置文件 chcp.json
和 chcp.manifest
,同时还提供了一些其他功能,详细可参考其 README。
3、下载插件后,执行 cordova platform add ios
时可能会遇到如下报错:
Error: Cannot find module 'xml2js/lib/processors'
参考 xml2js is not installed 解决方法很简单:npm install xml2js
热更新相关配置
Cordova Hot Code Push 下载安装到项目中后,需要对其进行相关的配置才能让其工作。
插件配置
Cordova Hot Code Push 热更新插件需要两个配置文件:
- Application config:
chcp.json
包含发布相关信息:热更新代码版本号,应用 native side 版本号等等 - Content manifest:
chcp.manifest
包含项目热更新代码(静态)文件信息:文件名和文件哈希值
这两个配置文件对于插件的运行缺一不可,前者描述了热更新代码的版本信息,后者提供了热更新代码文件的变更信息。借助 cordova-hot-code-push-cli
这个命令行工具可以辅助我们创建这两个配置文件。
Application config
Application config holds information about the current release of the web project.
chcp.json
置于 www
目录根目录,例子如下:
{
"name": "wps-*****",
"content_url": "https://kss.ksyun.com/*****/*****/",
"ios_identifier": "326CN*****",
"android_identifier": "com.**********.*****.*****.*****.*****",
"update": "resume",
"release": "2017.06.07-16.30.20",
"min_native_interface": 1
}
1、配置项
① name
项目名称
② content_url
web 项目文件在服务器上的存储路径(即 www 目录在云存储中的目录路径),热更新插件将此 URL 作为 base url,用于下载配置文件和项目更新文件(必需的配置项)
③ release
描述 web 项目版本号,每一次发布的版本号必须唯一(默认使用时间戳,格式为:yyyy.MM.dd-HH.mm.ss),插件是将版本号进行字符串相等比较来判断是否存在新版本(必需的配置项)
④ min_native_interface
Minimum version of the native side that is required to run this web content
- cordova 项目主要包含两部分:web content 和 native side。前者是网页内容,后者是 cordova 插件,为网页提供原生 API 支持,web content 的运行是基于 native side。
- 该配置项指明 web content 运行时 native side 的最低版本。在 native side 代码有变更后(cordova 插件新增/删除,native side 版本号更新),为了确保 web content 能正常运行,需要更新
min_native_interface
的值
在应用 config.xml
配置中可以定义了 native side 的版本号,例如
<chcp>
<native-interface version="5" />
</chcp>
例如当前项目 native side 的版本号是5:
- 如果服务器上配置文件
chcp.json
中的min_native_interface
值为 5,那么符合要求,热更新后的 web content 能够在正常运行 - 如果服务器上配置文件
chcp.json
中的min_native_interface
值为 10,高于config.xml
文件中<native-interface />
,那么热更新将无法正常进行。此时,插件会提示错误chcp_updateLoadFailed
,提示应用需要更新升级
⑤ update
何时触发进