应使用plus.runtime.getproperty(plus.runtime.appid, callback)获取固化版本号,它返回manifest.json中versionname值,打包即定、重启不变;必须包裹在plus.ready()中并加#ifdef app编译,禁用uni.getsysteminfosync().version因其在ios/android上行为不一致且受热更新影响。

怎么安全获取当前 App 版本号(plus.runtime.version vs uni.getSystemInfoSync)
别用 uni.getSystemInfoSync().version 做原生包更新判断——它在 iOS 和 Android 上行为不一致,某些打包配置下为空或带前缀(如 v1.2.3),且热更新后会变,不能代表 APK/IPA 固化版本。
真正可靠的来源是 plus.runtime.getProperty 返回的 widgetInfo.version,它对应 manifest.json 里填的 versionName,打包即固化,重启不变。
- 必须传
plus.runtime.appid才能正确读取,漏传会返回空或默认值 - H5+ 环境未就绪时调用会报错,务必包裹在
plus.ready(() => {...})中 - Android 8+ 和 iOS 都支持,但 H5 端该 API 不存在,需加
#ifdef APP条件编译 - 开发环境建议跳过:用
process.env.NODE_ENV === 'development'拦截,避免反复弹窗干扰调试
版本号比较为什么总出错(字符串比对陷阱)
"1.10.0" 返回 <code>true 是最常见翻车点。语义化版本不是数字,不能靠字典序或 parseFloat 比较。
服务端返回的版本可能带前缀(v1.2.3)、后缀(1.2.3-beta)或位数不齐(1.2 vs 1.2.0),前端必须清洗 + 分段比对。
- 清洗示例:
remoteVer.replace(/^v|[^0-9.]/g, '') - 比对函数必须按段转
Number,逐位比较,缺位补0("1.2"→[1,2,0]) - 返回值建议统一为
-1 / 0 / 1,方便后续判断:compareVersions(local, remote) 表示需要更新 - 别在请求回调里直接写安装逻辑——网络延迟会导致用户长时间无反馈,应先缓存版本数据再触发下载
强制更新弹窗为什么盖不住地图/视频(cover-view 必须用)
用 uni.showModal 或普通 <view></view> 实现弹窗,在 App 环境下会被 <map></map>、<camera></camera>、<video></video> 等原生组件遮挡,iOS 尤其明显。
唯一可靠方案是 <cover-view></cover-view> —— 它属于原生渲染层,层级高于所有 WebView 内容和原生组件。
- 必须放在
App.vue根节点底部,用v-if控制显隐,不能挂载在页面级组件内 -
<cover-view></cover-view>默认不响应点击,关闭需手动绑定bindtap并控制showUpdateModal - iOS 上弹窗闪一下就消失?大概率是 DOM 未就绪,建议加
setTimeout(() => { this.showUpdateModal = true }, 100) - Android 上空白区域无法关闭?检查是否漏了
bindtap或事件冒泡被拦截
静默安装为什么没反应(权限、路径、签名三要素)
Android 调 plus.runtime.install 静默失败,通常不报错、不提示,只在日志里静默吞掉。iOS 则根本不可静默安装,只能跳 App Store。
安卓侧关键检查点只有三个:权限、路径、签名。
- Android 11+ 必须提前申请
REQUEST_INSTALL_PACKAGES权限,否则调用直接失效(控制台无报错) - 下载路径必须是
_doc/或_www/下的合法子路径,plus.downloader.createDownload的filename参数要带完整路径,如'_doc/update/app.apk' - 新 APK 的签名必须与旧包完全一致,否则系统拒绝安装(尤其测试时用不同 keystore 打包容易踩坑)
- 华为/小米等厂商系统可能后台杀进程,建议下载前调
plus.runtime.preload()并监听statechange全状态
最易被忽略的点:iOS 强制更新本质是「阻断式引导」,不是真强制——你没法绕过 App Store 审核自动装包。所谓“强制”,只是不让用户进首页,直到他点开 App Store 页面。这个交互边界,上线前必须和产品确认清楚。











