wgt热更新本无安装弹窗,所谓弹窗或是自定义ui提示,或是android 8.0+因权限缺失或误用apk路径触发的系统安装界面;静默更新需同时满足:本地绝对路径传入.wgt、包名含正确appid、manifest.json匹配且签名一致、hbuilderx中正确打包为app专用wgt。

uni-app 的 WGT 热更新本身不产生“安装弹窗”——你看到的所谓弹窗,要么是自己写的 UI 提示(比如升级确认框),要么是 plus.runtime.install 在 Android 8.0+ 上因权限缺失触发的系统级安装界面。真正的静默更新(即无任何用户可见界面)只在满足全部前提时成立,而一旦出现弹窗,说明流程已偏离静默路径。
为什么 plus.runtime.install 会弹出系统安装页
这不是 uni-app 或 HBuilderX 的设计,而是 Android 系统强制行为:
- Android 8.0(API 26)起,所有 APK 安装(包括通过
plus.runtime.install调用)必须申请REQUEST_INSTALL_PACKAGES权限,且安装过程必显系统弹窗 - 但 WGT 更新本不该走 APK 安装路径——如果你看到弹窗,大概率是误用了
uni.installDocument或传入了 .apk/.ipa 文件路径,而非 .wgt - 真正在调用
plus.runtime.install('xxx.wgt')时弹窗,只有一种可能:该 wgt 包实际被识别为非法包(如 manifest.json 缺失、签名不一致),5+ 引擎降级尝试以 APK 方式安装,从而触发系统拦截
如何确认你真在走 WGT 静默路径
关键看三件事是否同时满足:
-
plus.runtime.install的第一个参数必须是本地绝对路径(如/data/user/0/io.dcloud.H52917B4F/wgt/UNI832D722_1.2.4.wgt),不是 HTTP URL;HTTP URL 必须先用plus.downloader.createDownload下载到本地再传入 - wgt 文件名必须含 appid(如
UNI832D722_1.2.4.wgt),且其内部manifest.json的appid字段与当前运行 App 的plus.runtime.appid完全一致 - 打包 wgt 时必须在 HBuilderX 中勾选「生成 wgt 包」+ 目标平台为「App」,不能选「通用」或「H5」;否则生成的包不含必要元信息,5+ 引擎拒绝静默加载
真正需要“关闭”的弹窗,其实是你自己加的提示层
绝大多数项目会在检测到新版本后,主动 show 一个 <uni-popup></uni-popup> 或自定义 modal 做升级提醒。这类弹窗的关闭逻辑和普通组件完全一致:
- 用
v-if控制:设showUpdatePopup = false即可隐藏,无需额外 API - 用
ref调用方法:若使用<uni-popup ref="updatePopup"></uni-popup>,则执行this.$refs.updatePopup.close() - 注意时机:不要在
plus.runtime.install的 success 回调里立即关闭弹窗——应等plus.runtime.restart()执行后再关,否则用户可能看到白屏闪动
WGT 静默更新的“静默”二字,本质是绕过系统安装流程;一旦出现弹窗,第一反应不该是“怎么关”,而是“为什么它没走静默路径”。检查 wgt 包合法性、签名一致性、以及是否误传了非 wgt 文件,比写个 close() 调用重要得多。











