uni-app 无静默安装开关,所谓“关闭”需彻底移除 plus.runtime.install/restart 调用、清理本地 wgt 状态并下线 wgt 包资源。

uni-app 本身没有“静默安装功能”这个开关——它不提供全局启用/禁用静默更新的配置项。所谓“静默安装”,实际是开发者主动调用 plus.runtime.install + plus.runtime.restart() 实现的 wgt 包热更新行为。要“关闭”,本质是**停止触发这套逻辑**,而不是关某个 flag。
为什么不能在 manifest.json 或 uni-app 配置里关掉静默更新
静默更新(wgt 热更)不是 uni-app 框架内置的自动机制,也不由 HBuilderX 打包过程默认开启。它完全依赖运行时代码主动调用 5+ API:plus.downloader.createDownload → plus.runtime.install → plus.runtime.restart()。manifest.json、vue.config.js、uni-app cli 都没有对应字段控制它是否生效。
常见误解:以为加了 "enablePullDownRefresh": false 或删掉 update 相关插件就能禁用——没用。只要业务代码里还存在那段调用链,它就可能执行。
如何真正停用 wgt 静默更新逻辑
必须从代码层切断触发路径,重点检查并修改以下位置:
- 全局版本检查模块(如
utils/update.js或store/modules/update.js):删除或注释掉plus.downloader.createDownload和后续 install/restart 调用 - App.vue 的
onLaunch或onShow中的自动检查逻辑:加上#ifdef APP-PLUS条件编译后,直接 return 或跳过整个块 - 服务端返回的更新策略字段(如
updateType: "wgt"):前端收到后不再解析,或统一忽略该字段 - 已发布的 wgt 包资源链接:从 CDN 下线或 403 拦截,避免旧版 App 仍能下载到合法 wgt 文件
误关导致白屏/404 的典型场景
很多人“关静默更新”时只删了 download 逻辑,却忘了清理残留状态:
- 本地已成功 install 过 wgt 包,但没 restart —— 此时
plus.runtime.widgetInfo.versionCode已变,但页面仍跑旧资源,重启 App 后首次加载会 404(找不到新 wgt 里的 index.html) - 代码里还留着
plus.runtime.restart()调用,但传入的 wgt 文件路径已失效(如/documents/old.wgt被删),结果触发空重启,WebView 重建失败白屏 - 未清除 localStorage 中的更新标记(如
lastWgtVersion),下次启动仍尝试比对,请求 404 的 wgt 地址,控制台报错干扰调试
最稳妥的“关闭”动作:删代码 + 清状态 + 下线包
单纯注释掉几行 JS 不够。真实项目中要确保三点同时落地:
- 移除所有
plus.runtime.install和plus.runtime.restart()的调用点(搜索整个工程,包括 node_modules 里自定义插件) - 在 App 启动时主动清理旧 wgt 状态:
plus.io.resolveLocalFileSystemURL('_www/', () => {}, () => {})不关键,但建议调用plus.runtime.getProperty('widgetInfo', (info) => { console.log(info.versionCode) })确认当前加载的是基座原版资源 - 通知运维将 wgt 下载地址 HTTP 301 重定向到 404,或 Nginx 层
deny all;,防止历史版本 App 继续拉取
真正难的不是删代码,而是确认所有分渠道包(华为、小米、应用宝等)都已发布不含该逻辑的新版本——否则用户手机里躺着一个会偷偷装 wgt 的老包,你关得再干净也没用。


















