真正能静默更新的只有wgt包;plus.runtime.install仅解压文件,必须紧接success回调内同步调用plus.runtime.restart()才能重建WebView并加载新资源,否则页面无变化或白屏报错。
真正能走静默路径的,只有 wgt 包热更新;整包(apk/ipa)无法静默,ios 完全禁止,android 8.0+ 必须弹系统安装页且需用户授权 request_install_packages 权限。
为什么 plus.runtime.install 后必须调用 plus.runtime.restart()
plus.runtime.install 只负责把 wgt 包解压到私有目录,JS 引擎、Vue 实例、路由缓存、静态资源引用仍指向旧版本。不调用 plus.runtime.restart(),页面不会变化,甚至白屏、404 或新旧代码混用报错。
- 它会卸载当前 WebView 容器并重建整个 webview 栈,从
index.html开始重新加载新资源 - Android 低版本(如 5+)常见错误:控制台显示 “install success”,但页面毫无反应 → 八成是漏了
plus.runtime.restart() - 别在
success回调外调用,也别写成异步延迟(如setTimeout(() => plus.runtime.restart(), 100)),必须紧接在 install 成功回调内同步执行
wgt 版本比对必须转整数,不能字符串比较
服务端返回的 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 } - 推荐用
semver.gt(newVer, curVer),比手写split('.').map(Number)更稳,尤其当版本含四位(如"1.2.3.20260530")时
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 必须与原安装包使用同一份证书签名;「云打包」和「自定义基座」签名不同,不可跨环境使用
plus.ready 是执行检查逻辑的唯一安全时机
在 onLaunch 函数体里直接调用 plus.runtime.getProperty 很容易失败——H5+ 环境未就绪,低端安卓机或冷启动下返回空或报错。
- 必须用
plus.ready(() => { this.checkAppUpdate() })包裹检查逻辑 - 开发环境务必加
process.env.NODE_ENV === 'development'判断并跳过,避免反复弹窗干扰 - 真机调试用的是开发基座,其
versionName固定为"1.0.0",热更新逻辑务必用#ifdef APP-PLUS包裹,并只在正式云打包或自定义基座中启用
最易被忽略的一点:wgt 升级只对 JS、Vue 页面及静态资源生效;改了原生层(如权限、插件、manifest.json 配置、CLI 升级)必须整包更新,否则用户打开就白屏或报错——这个边界不厘清,所有静默逻辑都建立在沙上。











