前言
app和h5相比,有着更新延迟和更新难的特性,h5在部署更新后可以保证所有用户访问的都是最新的功能,而app则可能存在多个版本,用户也可以选择不升级继续使用;
但是有时候,app进行了大规模的调整,导致之前所有版本的app都不可用,或者一些重要功能作出了调整(比如收费内容发生改变),强制用户需要更新app,这样的情况并不少见;
因此在第一版本的app内,就应该把包内更新的功能加上,以保证app的更新续航。
整包更新和热更新
APP的更新分为整包更新和热更新。
整包更新是指下载完整apk文件进行覆盖安装。
热更新是指把app有改动的地方打包进wgt文件,只更新wgt文件中的内容,不进行整包安装,在用户视角也叫做省流量更新
版本号约束
既然是版本更新,那就离开版本号的约束。
因为涉及两种更新方式,所以要先制定版本号的规范:
建议 严格遵循 Semantic Versioning 2.0.0 语义化版本规范。
主版本号:不兼容的 API 修改
次版本号:向下兼容的功能性新增
修订号:向下兼容的问题修正
实现原理
- 开发后台版本管理功能,每次发版上传android安装包,记录版本号、是热更新还是整包更新、是否强制更新等
- 每次打开app(onLaunch生命周期)的时候,通过接口请求最新版本信息,再获取当前安装包信息,对比版本号
- 如果版本号不一致,且接口获取的版本号大于当前应用的版本号,则进行整包更新或热更新。
- 需要注意的是,ios并不存在下载安装包覆盖安装这种操作,所以在ios平台需要跳转到appstore进行更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
|
其中有个部分要放入你的后端接口。(千万不要漏了这一步,不然会下载失败)
// 通过接口获取最新版本信息,具体请求不演示
getVersion({
_apiname:"xxx.xxx.xxxx", //这里放入后端给的接口 每个公司格式不一样 按自己喜好来
platform: '1'
}).then(res => {
if (!res) {
return;
}
其他方案
插件市场提供了uni-upgrade-center升级方案,包含了后台管理app版本以及app自动更新的逻辑,需要注意的是后台管理是基于uni-admin框架的插件,如果应用内没有使用uni-admin,集成起来会相对麻烦
参考资料