真正静默更新仅支持wgt包,因iOS完全禁止静默安装APK/IPA,Android 8.0+需用户授权REQUEST_INSTALL_PACKAGES且必显系统安装页;wgt升级后必须调用plus.runtime.restart()才能重载WebView并生效新资源。

uni-app App端所谓“静默更新”,实际只有 wgt 资源包升级这一条路可走;整包(APK/IPA)无法静默,iOS 完全禁止,Android 8.0+ 必须弹系统安装页且需用户授权 REQUEST_INSTALL_PACKAGES 权限。
plus.runtime.install 为什么必须配合 plus.runtime.restart
wgt 包下载后只是解压到应用私有目录,JS 引擎、Vue 实例、路由缓存、静态资源引用仍指向旧版本。不调用 plus.runtime.restart(),界面不会变化,甚至出现白屏、404 或新旧代码混用报错。
-
plus.runtime.install只负责写入文件,不触发重载 -
plus.runtime.restart()会卸载当前 WebView 容器并重建整个 webview 栈,从index.html开始重新加载新资源 - Android 低版本(如 5+ SDK
- 常见错误:控制台显示 “install success”,但页面毫无反应 → 八成是漏了
plus.runtime.restart()
versionCode 比对必须转整数,不能字符串比较
服务端返回的 wgtVersion 和本地 widgetInfo.versionCode 若按字符串比(如 "1.0.10" > "1.0.2"),结果为 false(字典序下 "1.0.10" "1.0.2")。必须统一转为整数再比。
- 前端取值必须用
parseInt(widgetInfo.versionCode),不能直接用widgetInfo.versionCode - 后端接口应接收整数型
versionCode,返回字段建议为{ update: true, wgtUrl: "...", isForce: false } - HBuilderX 打包 wgt 时,
manifest.json中的versionName字段必须严格递增(如"1.2.3"→"1.2.4"),不能含字母或横线(如"1.2.3-hotfix") - 真机调试用的是开发基座,其
versionName固定为"1.0.0",热更新逻辑务必用#ifdef APP-PLUS包裹,并只在正式云打包或自定义基座中启用
install wgt fail: invalid wgt file 常见原因与排查
这个错误不是网络层问题,而是 wgt 包本身不合法,uni.downloadFile 返回 200 并不代表能装成功。
-
manifest.json缺失:wgt 压缩包根目录下必须有manifest.json,HBuilderX 打包时要勾选「生成 wgt 包」且目标平台选「App」,不能选「通用」或「H5」 - appid 不匹配:wgt 包里
manifest.json的appid必须和当前运行 App 的plus.runtime.appid完全一致;测试时混用不同项目 wgt 是高频原因 - 签名不一致:wgt 必须与原安装包使用同一份证书签名;「云打包」和「自定义基座」签名不同,不可跨环境使用
- Content-Type 错误:Nginx/CDN 返回 wgt 时未设
Content-Type: application/octet-stream,部分 Android WebView 会拒绝解析
真正静默的关键不在“下载是否弹窗”,而在于“是否绕过系统安装流程”。wgt 升级本质是资源替换,它依赖 5+App 引擎的运行时能力,和原生层完全无关——这也意味着,任何试图用 uni.downloadFile + uni.installDocument 模拟静默安装的方案,在 iOS 上必然失败,在 Android 上也仅是伪静默。


















