判断更新方式的核心依据是服务端返回的 updateType 字段("1"为增量、"2"为全量),前端仅执行指令,不参与版本逻辑判断,且必须确保 wgt 基线版本与当前 app version 严格一致,否则 plus.runtime.install() 会静默失败。

怎么判断该走增量还是全量更新
核心依据是服务端返回的 updateType 字段(常见值为 "1" 表示增量、"2" 表示全量),前端不做版本逻辑判断,只按服务端指令执行。但必须确保:服务端生成的 wgt 增量包,其基线版本号与当前 app 安装包的 version 严格一致,否则 plus.runtime.install() 会静默失败,且无明确错误提示。
常见错误现象:
- 调用
plus.runtime.install()后无反应,控制台也无报错 - 安装成功回调触发,但重启后页面未更新(实际是 wgt 包与当前基线不匹配)
- iOS 端调用
plus.runtime.install()直接抛出“not supported”错误(iOS 不支持 wgt)
实操建议:
- 真机调试时,务必在打包安装后获取真实
appid和version,开发环境里plus.runtime.appid是"HBuilder",会导致比对失效 - 服务端应校验请求中的
version是否存在于已发布的基线列表中;若不存在,强制返回全量路径 - 前端可加一层兜底:当 wgt 安装失败(fail 回调触发)时,自动降级尝试全量更新流程
增量更新:wgt 包下载安装全流程
wgt 是纯资源包,不包含原生层代码,仅更新 _www 下的 HTML/JS/CSS/静态资源。它依赖 HBuilderX 打包时生成的差分逻辑,不是简单 zip 压缩。
关键步骤:
- 调用
uni.downloadFile({ url: wgtUrl })下载,注意statusCode === 200才继续 - 传入
downloadResult.tempFilePath给plus.runtime.install(),force: false即可(true 会覆盖已有 wgt) - 必须调用
plus.runtime.restart(),否则新资源不会加载;uni.reLaunch()或uni.navigateBack()无效 - 下载进度用
downloadTask.onProgressUpdate()监听,避免卡死 UI
容易踩的坑:
- 没清缓存导致旧 JS 还在执行 —— wgt 更新后首次启动会自动清除旧资源缓存,但若用户手动 kill 进程再打开,可能因冷启动加载旧缓存,建议在
onLaunch中加uni.clearStorage()清理关键本地缓存 - Android 11+ 需要
android:requestLegacyExternalStorage="true"才能写入_downloads目录,否则tempFilePath写入失败
全量更新:APK/IPA 安装与平台差异处理
全量更新本质是调起系统安装器,行为完全由 OS 控制,前端只能触发和监听结果。
实操要点:
- Android:用
plus.runtime.install(apkPath, { force: true }, success, fail)可静默安装(需开启“未知来源”权限);否则 fallback 到plus.runtime.openURL(apkUrl)跳转浏览器下载 - iOS:
plus.runtime.install()无效,必须跳转 App Store,链接格式为itms-apps://apps.apple.com/app/id{appId},其中appId是 Apple 分配的 Bundle ID,不是 uni-app 的appid - 下载 APK 建议用
plus.downloader.createDownload()而非uni.downloadFile(),前者支持断点续传、后台下载,且路径可控(如指定_downloads/xxx.apk)
性能影响:
- APK 文件越大,下载耗时越长,用户流失率越高;建议 >5MB 的包启用分片校验或预加载提示
- 安装过程会中断当前 app 进程,iOS 上用户可能误以为闪退,需提前弹窗说明“即将跳转至 App Store”
切换逻辑不能硬编码在客户端
所谓“切换”,不是前端 if-else 决定走哪条路,而是服务端根据当前 version + 用户设备信息(OS、ABI、是否 jailbreak)动态返回策略。前端只做执行器。
典型服务端决策逻辑:
- 当前 version 是 3.2.0 → 返回 wgt(基线存在)
- 当前 version 是 2.1.5 → 返回 APK(无对应基线,或该版本距最新版跨度超 3 个迭代)
- 当前是 iOS → 忽略 wgt 字段,只返回 App Store 链接
- 当前请求头含
X-Debug: true→ 强制返回全量(方便测试)
最容易被忽略的点:
- manifest.json 中的
versionName和versionCode必须与打包时实际写入 APK 的一致,否则plus.runtime.getProperty()读出的 version 与服务端记录对不上 - wgt 包上传后,服务端需校验其
manifest.json内的version字段,防止人工上传错版本 - 用户手动清除应用数据后,
plus.runtime.getProperty()仍可读取,但 wgt 安装路径可能失效,需重置安装逻辑











