wgt热更新仅限JS、Vue页面及静态资源,原生层修改(如权限、插件、manifest配置、CLI升级)必须整包更新;versionCode需数值比对,wgt生效需校验+重启WebView,且须避开用户操作高峰。

怎么判断该走 wgt 热更新还是整包 apk 更新
热更新(wgt)和整包更新(apk)不是二选一,而是分工明确:wgt 只能更新 JS、Vue 页面、静态资源(如图片、样式),改不了原生层——比如新增 uni.getLocation 权限、加了个新的原生插件、改了 manifest.json 里的 permissions 或 features,这些都必须走整包。否则用户打开就白屏或报错。
- 你改了
pages.json的 tabBar 图标路径?→ wgt 可以 - 你新加了
uniCloud的云函数调用逻辑?→ wgt 可以 - 你新增了微信登录的 native 插件,并在
manifest.json里加了"weixin": {"appid": "..."}?→ 必须整包 - 你升级了
uni-appCLI 版本,导致底层base64解码逻辑变更?→ 整包(wgt 运行在旧 runtime 上)
很多团队踩坑,是因为把“功能上线”等同于“代码发版”,忽略了 plus.runtime.version 和 plus.runtime.getProperty(appid) 返回的运行时环境是固定的——它不随 wgt 变。
plus.runtime.getProperty 拿到的版本号到底比什么
别直接比字符串。例如当前是 "1.2.0",接口返回 "1.10.0",字符串比较 "1.10.0" > "1.2.0" 是 false(因为 "1." 后面先比 "1" 和 "2")。必须语义化解析。
- 推荐用轻量库
semver.gt(newVer, curVer),比手写 split 更稳 - 如果你的后端只返回
versionCode(整数),那直接比数字更安全,且避免语言/地区格式干扰 -
plus.runtime.version是 manifest.json 里的versionName,而实际用于比对的应是后端统一维护的versionCode字段,它才是单调递增的权威依据
还有个隐藏点:plus.runtime.getProperty 在某些低端 Android 机型上会异步延迟返回,别在 App.vue onLaunch 里同步卡住 UI 等它——先渲染首页,再后台静默查版本。
wgt 包下载后为啥没生效?三个高频断点
wgt 下载成功 ≠ 更新完成。它要经历下载 → 校验 → 替换 → 重启 WebView 四步,中间任一环失败,用户就还在老版本里跑。
- 没调
plus.runtime.restart():wgt 包解压完只是“备好了”,不重启,JS 还是读旧缓存。注意:这个重启是软重启,不杀进程,但会清空 Vue 实例和页面栈 - CDN 缓存了旧 wgt:服务器返回的 wgt 文件名如果固定(如
update.wgt),浏览器或 CDN 会缓存响应体。务必用带 hash 或时间戳的路径,比如/wgt/1.3.2-8a7f.wgt - AppID 不一致:你在 HBuilderX 云端打包时换了证书、改了包名,生成的新 AppID 和之前上传 wgt 时填的不一致,
plus.runtime.install()会静默失败,连错误日志都不抛(这是 uni-app 的设计缺陷)
验证是否真生效?进 H5 调试模式,在 console 执行 plus.runtime.getProperty(plus.runtime.appid, cb),看回调里 version 和 wgtVersion 是否已更新;或者打印 __UNI__APP_VERSION 全局变量(需在 manifest.json 开启“版本信息注入”)。
静默更新流程中,如何避免用户正在操作时突然重启
静默 ≠ 强制打断。用户在填写表单、播放语音、定位中,你调 plus.runtime.restart(),体验极差,还可能丢数据。
- 监听
plus.webview.currentWebview().addEventListener('hide', ...),当页面切后台时再重启,最安全 - 用
uni.getStorageSync('update_pending')记录待更新状态,下次冷启动时第一时间restart(),而不是热更中途硬切 - 对于强交互页(如支付页、地图页),可在页面
onUnload钩子中检查是否有待生效 wgt,有则延后到下一页再触发
真正难的不是技术实现,而是 wgt 更新的“边界感”——它不能改生命周期、不能动原生桥、不能影响 runtime 状态。一旦越界,问题就会藏得很深:比如某次 wgt 更新后,uni.showToast 偶发不显示,最后发现是新 wgt 里某个全局 mixin 错误覆盖了 uni 对象原型。


















