增量更新必须用wgt包而非APK,仅更新JS/CSS/图片等前端资源差异,不涉及原生代码变更;需通过HBuilderX制作资源升级包、HTTPS直链下载、compareVersion语义化比对版本,并调用plus.runtime.reloadWgt与plus.runtime.restart生效。

增量更新必须用 wgt 包,不是 APK
uni-app 的「增量更新」特指资源包(wgt)更新,不是整包 APK 替换。它只下发 JS、CSS、图片等前端资源差异,不涉及原生代码变更,因此无需重新安装 APP,也绕开了安卓 8+ 的 REQUEST_INSTALL_PACKAGES 权限问题。如果你在 manifest.json 里改了原生配置、加了新原生插件、或调整了 Android/iOS 特有逻辑,那必须走整包更新——这时候谈「增量」就是误判场景。
常见错误现象:plus.runtime.install() 报错 INSTALL_FAILED_USER_RESTRICTED,或 iOS 上静默失败无响应,基本是因为你误把 wgt 当成 apk 去调用安装 API。
-
wgt更新流程是:downloadFile → plus.runtime.reloadWgt → plus.runtime.restart - 下载地址必须是 HTTPS 直链,且服务器需支持
Range请求(否则断点续传和差分校验会失效) - HBuilderX 打包时要选「制作移动App资源升级包」,输出的是
UNIxxxxxx.wgt文件,不是xxx.apk
版本比较必须用 compareVersion,不能字符串比
服务端返回的 version 字段(比如 "1.10.0")和本地 plus.runtime.version(比如 "1.9.0")若直接用 > 比较,会因字典序导致误判:"1.9.0" > "1.10.0" 返回 true,但实际是旧版。这在跨月发版(如 1.9 → 1.10)时高频出错。
uni-app 官方推荐的 compareVersion(a, b) 函数按语义化规则逐段转数字比对,应直接复用:
const res = compareVersion(plus.runtime.version, serverData.version); if (res
- 服务端 version 必须规范:仅含数字和点,禁止前导零(
"1.05.0"❌)、字母("v1.2.0"❌)、空格("1.2.0 "❌) - manifest.json 中的「应用版本号」也要保持一致格式,否则
plus.runtime.version取出来就不匹配
plus.runtime.reloadWgt 后必须 plus.runtime.restart
plus.runtime.reloadWgt 只是把新 wgt 解压覆盖到 _www 目录,但当前 JS 运行上下文仍是旧资源。不重启的话,用户看到的还是老页面,新逻辑不会生效——这不是 bug,是设计行为。
正确链路是:
uni.downloadFile({
url: wgtUrl,
success: (res) => {
if (res.statusCode === 200) {
plus.runtime.reloadWgt(res.tempFilePath, () => {
plus.runtime.restart(); // 必须这一步
}, (e) => {
console.error('reloadWgt failed', e);
});
}
}
});
- iOS 上
reloadWgt成功后,restart()会触发冷启动,白屏约 0.5–1 秒属正常 - Android 上若使用自定义基座(非标准云打包),需确认基座已开启「wgt 升级」能力(HBuilderX → 发行 → 原生App控制台 → 模块配置)
- 不要在
onLaunch里立即调用;务必等plus.ready触发后再执行,否则plus.runtime对象未就绪,调用直接静默失败
强制更新时 iOS 需处理 NSCachesDirectory 清理风险
iOS 系统可能在存储紧张时自动清理 NSCachesDirectory(wgt 默认解压路径),导致重启后回退到旧版。这不是 uni-app 的缺陷,而是系统策略。
应对方式很务实:
- 每次
reloadWgt前,先用plus.io.resolveLocalFileSystemURL检查目标路径是否存在且完整 - 若校验失败(如文件缺失、MD5 不匹配),应降级为重新下载 + 重试,而非跳过
- 上线前务必在低存储空间的真机上实测:手动占满磁盘 → 启动 APP → 触发更新 → 杀进程再启,确认是否仍能加载新版
这个点容易被忽略,因为模拟器和开发机几乎不触发清理,但上线后部分老年 iPhone 用户会集中反馈「更新了又变回去」。











