UNIAPP版本号更新app 逻辑解析
Uniapp 版本更新(App 端)完整逻辑解析
Uniapp 开发的 App 实现版本自动检测更新、下载安装,是移动端最常用的功能,核心逻辑分为 前端检测 → 后台对比 → 下载更新 → 安装重启 四大步骤。
我会用最清晰、可直接落地的方式给你解析完整逻辑,包含安卓 + iOS 双端适配规则。
一、核心概念(先搞懂 3 个关键参数)
App 版本更新必须用到 3 个核心字段,前后端必须统一:
- 当前版本号
:App 本地的版本( manifest.json里配置) - 最新版本号
:后端接口返回的线上最新版本 - 更新规则
:大版本强制更新 / 小版本可选更新
版本号规范:推荐使用
x.y.z格式(如 1.0.0),纯数字对比,不要加字母。
二、完整更新流程(逻辑总览)
plaintext
启动 App → 调用后端版本检查接口 ↓对比 本地版本 < 线上版本? ↓ 否 → 正常进入 App 是 → 判断是否强制更新 ↓强制更新 → 弹窗不可关闭,必须下载安装可选更新 → 弹窗可关闭,提示用户更新 ↓下载安装包(安卓)/ 跳 App Store(iOS) ↓安装完成 → 重启 App
三、分平台逻辑(重点!安卓和 iOS 完全不同)
1. 安卓(Android):支持全流程自动更新
✅ 支持:后台检测 → 下载 apk → 自动安装 → 重启✅ 支持:强制更新、静默下载、进度条
2. iOS:不允许下载安装包,只能跳转应用商店
❌ 禁止下载 ipa(苹果规则)✅ 逻辑:检测到新版本 → 直接跳转到 App Store 对应页面
四、详细步骤拆解(可直接开发)
第 1 步:配置本地版本号
打开 manifest.json → 基础配置 → 应用版本号、版本名称
versionCode
:数字(用于代码对比,必须递增) versionName
:显示给用户看(如 1.0.0)
// Uniapp 获取本地版本代码plus.runtime.getProperty(plus.runtime.appid, (wgtInfo) => {console.log('当前版本码:', wgtInfo.versionCode) // 用于对比console.log('当前版本名:', wgtInfo.version) // 显示用})
第 2 步:后端接口设计(必须返回以下字段)
后端提供一个 GET/POST 接口,返回:
{"code": 200,"data": {"hasUpdate": true, // 是否有更新"isForce": false, // 是否强制更新"versionCode": 20, // 最新版本码(数字)"versionName": "1.0.1", // 最新版本名"updateDesc": "修复已知bug,优化体验", // 更新说明"androidUrl": "https://xxx.apk", // 安卓下载地址"iosUrl": "https://apps.apple.com/xxx" // iOS 商店地址}}
// 1. 获取本地版本const localVersion = wgtInfo.versionCode;// 2. 获取线上版本const res = await request('/api/app/version');const {hasUpdate, isForce, versionCode,androidUrl, iosUrl, updateDesc} = res.data;// 3. 核心判断:是否需要更新if (hasUpdate && versionCode > localVersion) {// 执行更新弹窗this.showUpdateModal(isForce, androidUrl, iosUrl, updateDesc);}
第 4 步:弹窗逻辑
- 强制更新
:弹窗无关闭按钮,不更新无法使用 App - 可选更新
:弹窗有关闭按钮,用户可稍后更新
第 5 步:下载与安装(安卓专属)
Uniapp 使用 plus.downloader 下载 apk,plus.runtime.install 安装
// 下载安卓安装包const downloadTask = plus.downloader.createDownload(androidUrl, {filename: "_doc/update/"}, (downloadRes, status) => {if (status == 200) {// 下载成功 → 安装plus.runtime.install(downloadRes.filename, {force: true}, () => {// 安装成功 → 重启plus.runtime.restart();});}});// 开始下载downloadTask.start();
// 直接跳转到 App Storeplus.runtime.openURL(iosUrl);
五、强制更新 vs 可选更新 逻辑
表格
|
|
|
|
|
|---|---|---|---|
| 强制更新 |
|
|
|
| 可选更新 |
|
|
|
强制更新实现要点:弹窗遮罩整个屏幕,监听返回键、物理返回键,禁止关闭弹窗。
六、完整业务流程图(极简版)
App启动↓获取本地versionCode↓请求后端版本接口↓本地版本 < 线上版本?├── 否 → 进入首页└── 是 → 显示更新弹窗↓强制?→ 是 → 禁止关闭,必须下载安装→ 否 → 可选关闭,提示更新↓安卓:下载apk → 安装 → 重启iOS:跳转App Store
七、常见注意事项(避坑)
- 版本对比必须用 versionCode(数字)
,不要用版本名字符串 -
安卓必须配置安装、读写文件权限,否则无法安装 -
下载链接必须是 HTTPS(安卓 9 + 要求) -
iOS 不能实现自动更新,只能跳转商店(苹果硬性规则) -
强制更新必须在首页加载前执行
总结
-
Uniapp App 更新核心是版本号对比 + 分平台处理 -
安卓:全自动化(检测→下载→安装→重启) -
iOS:只能跳 App Store,无法本地安装 -
强制更新通过弹窗拦截实现,是最常用的业务需求 -
评论区点赞超过10w+,上demo链接
demo
夜雨聆风