应在 plus.ready 完成后执行版本检查,开发环境跳过,主页面后触发;用 compareversion 数值比较;服务端 version 需规范;安卓 8+ 需申请 request_install_packages 权限;下载用 https 直链并监听全状态。

怎么在 onLaunch 里安全触发版本检查
App 启动时立刻查更新看似合理,但实际容易因 H5+ 环境未就绪导致 plus.runtime.getProperty 报错或返回空。必须等 plus.ready 完成后再执行核心逻辑,否则在低端安卓机或冷启动场景下大概率失败。
- 不要直接在
onLaunch函数体里调用plus.runtime.getProperty - 改用
plus.ready(() => { this.checkAppUpdate() })包裹检查逻辑 - 开发环境务必加
process.env.NODE_ENV === 'development'判断并跳过,避免测试时反复弹窗干扰 - 如果首页有登录态校验或网络请求依赖,建议把检查逻辑延后到用户进入主页面后(比如
onShow或路由守卫中),而非强绑在onLaunch
版本号比较不能只用字符串相等判断
currentVersion !== version 这种写法在多数场景下会漏判——比如本地是 "1.9.0",服务器返回 "1.10.0",字符串比较结果为 true(因为 "1.9.0" > "1.10.0" 字典序成立),但实际是旧版。必须转为数值型语义比较。
- 推荐用
uni-app社区验证过的compareVersion(a, b)工具函数:按点分段转数字逐位比对 - 服务端返回的
version字段必须规范,禁止带空格、前导零、字母(如"v1.2.0"或"1.2.0-beta") - 本地版本取自
plus.runtime.version,确保manifest.json中的versionName填的是纯数字格式(如1.2.0),别写成1.2或1.2.0.20260327这类不规则形式
静默下载安装要绕开安卓 8+ 的未知来源限制
从 Android 8(API 26)起,plus.runtime.install() 直接安装 APK 会失败,报错 INSTALL_FAILED_USER_RESTRICTED,除非用户手动开启「允许来自此来源的应用」开关——这和「静默」目标完全冲突。
- 必须提前申请
REQUEST_INSTALL_PACKAGES权限,并在manifest.json → 模块配置 → Native.js 权限配置中勾选 - 首次安装前需调用
plus.android.requestPermissions(['android.permission.REQUEST_INSTALL_PACKAGES'], ...)获取授权 - 下载路径建议用
_doc/目录(如_doc/update.apk),避免写入外部存储被系统拦截 - 强制更新时,若权限未授予,应引导用户去设置页手动开启,而不是卡死或静默失败
plus.downloader 下载任务没回调?重点看状态监听和异常捕获
常见现象是调用 createDownload 后没进 statechanged 回调,或者只触发一次 start 就停住。根本原因多是 URL 协议不匹配、证书问题或下载路径非法。
- 确保下载链接是 HTTPS(HTTP 在 Android 9+ 默认被禁,且 uni-app 2.7+ 也默认拒绝)
- 监听必须写全状态:
downloadTask.addEventListener('statechanged', (task, status) => { if (status === 2) { /* 下载完成 */ } else if (status === 4) { /* 失败 */ } }) - 不要忽略
failed和cancelled状态,尤其在用户切后台时,H5+ 可能主动中断任务 - 同一个 URL 多次调用
createDownload会复用已有任务,如需强制重试,请先downloadTask.abort()
实际项目中最容易被忽略的,是服务端返回的 filePath 字段是否真实可访问——它必须是直链(非跳转、无登录态校验),且响应头包含 Content-Disposition: attachment,否则安卓侧无法识别为可安装文件。










