静默更新仅支持wgt包,因它不触发系统安装流程而只替换WebView资源;APK/IPA整包更新在iOS完全不可静默,Android8.0+即使授权也需用户确认系统安装页;wgt更新后必须同步调用plus.runtime.restart()才能生效,否则页面仍为旧版。

静默更新只支持 wgt 包,不是所有“更新”都算静默
真正能静默的,只有 wgt 包——它不走系统安装流程,只替换 WebView 里的 JS、Vue 页面和静态资源。APK/IPA 整包更新在 iOS 完全不可静默;Android 8.0+ 即使申请了 REQUEST_INSTALL_PACKAGES 权限,也必须弹出系统安装页,用户点“继续”才能装,这不算静默。
所以别被“自动下载 + 自动安装”误导:下载可以后台做,但安装是否“静默”,取决于你用的是 wgt 还是 apk。
-
wgt更新成功后,必须调用plus.runtime.restart()才生效,否则页面还是旧的,甚至白屏或 404 - 仅限 5+ App 引擎环境(即 HBuilderX 云打包或自定义基座),H5、小程序、快应用等平台不支持
- 改了原生层(如新增权限、插件、
manifest.json配置)必须整包更新,wgt无法覆盖
版本比对必须转整数,字符串比较会翻车
服务端返回的 wgtVersion 和本地 plus.runtime.widgetInfo.versionCode 都是数字类型,但很多人误用字符串直接比,比如 "1.0.10" > "1.0.2" → 结果是 false(字典序下 "1.0.10" 小于 "1.0.2")。
正确做法是统一转为可比较的数值结构:
- 前端取本地版本用
parseInt(plus.runtime.widgetInfo.versionCode),不是widgetInfo.version - 推荐用
semver.gt(newVer, curVer),比手写split('.').map(Number)更稳,尤其当版本含四位(如"1.2.3.20260530")时 - 服务端接口字段建议返回整数型
versionCode,避免传"v1.2.0"或带空格的格式
plus.runtime.install 后漏掉 plus.runtime.restart() 是最常见失败原因
很多开发者看到控制台打印 "install success" 就以为完事了,结果页面没变、样式错乱、甚至路由跳转报错——八成是因为没在 success 回调里同步执行 plus.runtime.restart()。
plus.runtime.install 只负责把 wgt 解压到私有目录,JS 引擎、Vue 实例、路由缓存仍指向旧资源。只有 plus.runtime.restart() 会卸载当前 WebView 并重建整个栈,从 index.html 重新加载。
- 必须紧接在
success回调内同步执行,不能写成setTimeout(() => plus.runtime.restart(), 100) - 不能放在回调外,也不能延迟调用,否则新包不会启用
- 低端安卓机(如 Android 5+)冷启动时尤其容易因异步延迟导致白屏
install wgt fail: invalid wgt file 的真实原因不是网络,而是包本身
这个错误常被误判为下载失败,其实 uni.downloadFile 返回 200 并不代表 wgt 合法。真正原因几乎都来自打包或配置环节:
-
manifest.json缺失:wgt 压缩包根目录下必须有该文件,且appid必须和当前 App 的plus.runtime.appid完全一致 - 打包设置错误:HBuilderX 中必须勾选「生成 wgt 包」,目标平台选「App」,不能选「通用」或「H5」
- 签名不匹配:wgt 必须与原安装包使用同一份证书签名;云打包基座和自定义基座签名不同,不可混用
- 路径问题:下载后传给
plus.runtime.install的必须是绝对路径(推荐用plus.downloader.createDownload,它返回的d.filename是绝对路径)
真正静默的关键不在“多快下载完”,而在“包合法、比对准、重启及时”。这三个点任何一个卡住,用户就感知不到更新——不是没发生,是根本没生效。


















