跨平台应用开发进阶 (三): uni-app 实现资源在线升级 / 热更新
一、前言
使用 uni-app
开发跨终端应用,可将代码编译到iOS
、Android
、微信小程序等多个平台,升级时也需考虑多平台同步升级。其中,uni-app
发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级。
HBuilderX 1.6.5
起,uni-app
支持生成 App
资源升级包wgt
。
二、wgt 资源升级包升级
2.1 修改版本号
首先,更新 manifest.json
中的版本号。比如之前是 1.0.0
,那么新版本应该是 1.0.1
或 1.1.0
这样。
2.2 发行
然后,在 HBuilderX
中生成升级包(wgt
)。
生成结束会在控制台告知升级包的输出位置。
2.3 安装资源升级包
应用的升级需要服务端与客户端配合完成,下面以本地测试过程中的操作举例说明:
存放资源将 %appid%.wgt
文件存放在服务器的 static
目录下,即 http://www.example.com/static/UNI832D722.wgt
。
服务端接口约定检测升级的接口,地址为:http://www.example.com/update/
传入参数
name
String 客户端读取到的应用名称,定义这个参数可以方便多个应用复用接口。version
String 客户端读取到的版本号信息
返回参数
update
Boolean false 是否有更新wgtUrl
Stringwgt
包的下载地址,用于wgt
方式更新。pkgUrl
Stringapk/ipa
包下载地址或AppStore
地址,用于整包升级的方式。
2.3.1 代码示例
下面是一个简单的服务端判定的示例,仅做参考,实际开发中根据自身业务需求处理。
注意事项
服务端的具体判定逻辑,请根据自身的业务逻辑灵活处理。
应用中的路径尽量不要包含特殊符号。
客户端检测升级在 App.vue
的 onLaunch
中检测升级,代码如下:
不支持资源升级包情况如下:
SDK
部分有调整,比如新增了Maps
模块等,不可通过此方式升级,必须通过整包的方式升级。原生插件的增改,同样不能使用此方式。
对于老的非自定义组件编译模式,这种模式已经被淘汰下线。但以防万一也需要说明下,老的非自定义组件编译模式,如果之前工程没有
nvue
文件,但更新中新增了nvue
文件,不能使用此方式。因为非自定义组件编译模式如果没有nvue
文件是不会打包weex
引擎进去的,原生引擎无法动态添加。自定义组件模式默认就含着weex
引擎,不管工程下有没有nvue
文件。
注意事项⚠️
条件编译,仅在
App
平台执行此升级逻辑。appid
以及版本信息等,在HBuilderX
真机运行开发期间,均为HBuilder
这个应用的信息,因此需要打包自定义基座或正式包测试升级功能。plus.runtime.version
或者uni.getSystemInfo()
读取到的是apk/ipa
包的版本号,而非manifest.json
资源中的版本信息,所以这里用plus.runtime.getProperty()
来获取相关信息。⚠️安装
wgt
资源包成功后,必须执行plus.runtime.restart()
,否则新的内容并不会生效。如果
App
的原生引擎不升级,只升级wgt
包时需要注意测试wgt
资源和原生基座的兼容性⚠️。平台默认会对不匹配的版本进行提醒,如果自测没问题,可以在manifestt.json
中配置忽略提示。⚠️应用市场为了防止开发者不经市场审核许可,给用户提供违法内容,对热更新大多持排斥态度。
但实际上热更新使用非常普遍,不管是原生开发中还是跨平台开发。
Apple
曾经禁止过jspatch
,但没有打击其他的热更新方案,包括cordovar、react native、DCloud
。封杀jspatch
其实是因为jspatch
有严重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App
的数据。
使用热更新需要注意⚠️:
🙅♂️上架审核期间不要弹出热更新提示;
⚠️热更新内容使用
https
下载,避免被三方网络劫持;🙅不要更新违法内容、不要通过热更新破坏应用市场的利益,比如
iOS
的虚拟支付要老老实实给Apple
分钱。
三、整包升级
接口约定如下数据接口约定仅为示例,开发者可以自定义接口参数。
请求地址:https://www.example.com/update
请求方法:GET
请求数据:
响应数据:
3.1 客户端实现
App
启动时,向服务端上报当前版本号,服务端判断是否提示升级。
在App.vue
的onLaunch
中,发起升级检测请求,如下:
注意⚠️:App
的升级检测代码必须使用条件编译,否则在微信环境由于不存在plus
相关API
,将会报错。
3.2 数据表实现
需维护一张数据表,用于维护APP
版本信息,主要字段信息如下:
3.3 服务端实现
根据客户端接收的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rlease notes
、更新包地址
等)
开发者可以根据服务端开发语言,自己实现升级检测逻辑,如下是一个php
示例代码:
注意事项⚠️:
plus.runtime.appid
,plus.runtime.version
,plus.runtime.openURL()
在真机环境下才有效。版本检测需要打包
app
,真机运行基座无法测试。因为真机运行的plus.runtime.version
是固定值。根据谷歌应用市场的审核规范,应用升级只能通过提交应用市场更新,不能通过下载
apk
安装方式更新应用。apk
安装失败可能是因为缺少android.permission.INSTALL_PACKAGES
、android.permission.REQUEST_INSTALL_PACKAGES
权限导致,注意:添加上面两个权限无法通过谷歌审核。
四、Uni-app 版本升级中心
uni-app
提供了一整套版本维护框架,包含升级中心uni-upgrade-center - Admin
、前台检测更新uni-upgrade-center-app
。
4.1 升级中心 uni-upgrade-center - Admin
uni-app
提供了版本维护后台应用升级中心uni-upgrade-center - Admin
,升级中心是一款uni-admin
插件,负责App
版本更新业务。包含后台管理界面、更新检查逻辑,App
内只要调用弹出提示即可。
在上传安装包界面填写此次发版信息,其中包地址可以选择手动上传一个文件到云存储,会自动将地址填入该项。
也可以手动填写一个地址(例如:https://appgallery.huawei.com/app/C10764638),就可以不用再上传文件。
⚠️如果是发布苹果版本,包地址则为应用在AppStore
的链接。
升级中心有以下功能点:
云储存安装包
CDN
加速,使安装包下载的更快、更稳定应用管理,对
App
的信息记录和应用版本管理。版本管理,可以发布新版,也可方便直观的对当前
App
历史版本以及线上发行版本进行查看、编辑和删除操作。版本发布信息管理,包括更新标题,内容,版本号,静默更新,强制更新,灵活上线发行的设置和修改。
原生
App
安装包,发布Apk
更新,用于App
的整包更新,可设置是否强制更新。
wgt
资源包,发布wgt
更新,用于App
的热更新,可设置是否强制更新,静默更新。App 管理列表及 App 版本记录列表搜索。
只需导入插件,初始化数据库即可拥有上述功能。
也可以自己修改逻辑自定义数据库字段,和随意定制 UI 样式。
4.2 前台检测更新 uni-upgrade-center-app
uni-upgrade-center-app
负责前台检查升级更新。
项目结构如下图所示:
检测更新视图如下图所示:
该插件提供如下功能:
统一管理
App
及App
在Android
、iOS
平台上App
安装包和wgt
资源包的发布升级。基于
uni-upgrade-center
一键式检查更新,统一整包与wgt
资源包更新。自行根据传参完成校验,判断此次更新使用哪种方式。
一键式升级。已集成弹框、下载、安装、是否强制重启等逻辑。
下载完成如果取消升级自动缓存安装包,下次进入判断是否符合安装条件,判断不通过则自动清除。
美观,实用,可自定义扩展。
注意:⚠️在手机基座上运行时获取到的版本号和 appid 是 hbuilder 和 hbuilder 的版本需要在文件里面手动设置。
4.3 工作原理
升级中心uni-upgrade-center - Admin负责维护版本信息,并将版本信息维护至数据库中。前台检测更新插件uni-upgrade-center-app负责提供调用云函数读取数据库维护的版本信息一键式检查更新。
4.4 疑问
前台检测更新插件 uni-upgrade-center-app 应用云函数实现版本检测,当应用部署至内网后,应如何实现?
五、拓展阅读
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/0590f685b2fc479f3626db079】。文章转载请联系作者。
评论