乐于分享
好东西不私藏

UNIAPP版本号更新app 逻辑解析

UNIAPP版本号更新app 逻辑解析

Uniapp 版本更新(App 端)完整逻辑解析

Uniapp 开发的 App 实现版本自动检测更新、下载安装,是移动端最常用的功能,核心逻辑分为 前端检测 → 后台对比 → 下载更新 → 安装重启 四大步骤。

我会用最清晰、可直接落地的方式给你解析完整逻辑,包含安卓 + iOS 双端适配规则。


一、核心概念(先搞懂 3 个关键参数)

App 版本更新必须用到 3 个核心字段,前后端必须统一

  1. 当前版本号
    :App 本地的版本(manifest.json 里配置)
  2. 最新版本号
    :后端接口返回的线上最新版本
  3. 更新规则
    大版本强制更新 / 小版本可选更新

版本号规范:推荐使用 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 商店地址  }}
第 3 步:前端版本对比逻辑
// 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, {      forcetrue    }, () => {      // 安装成功 → 重启      plus.runtime.restart();    });  }});// 开始下载downloadTask.start();
第 6 步:iOS 跳转逻辑
// 直接跳转到 App Storeplus.runtime.openURL(iosUrl);

五、强制更新 vs 可选更新 逻辑

表格

类型
弹窗行为
用户操作
适用场景
强制更新
不可关闭、无取消按钮
必须下载才能进 App
重大 bug、不更新无法使用
可选更新
可关闭、有取消按钮
可跳过更新
功能优化、小改动

强制更新实现要点:弹窗遮罩整个屏幕,监听返回键、物理返回键,禁止关闭弹窗


六、完整业务流程图(极简版)

App启动   ↓获取本地versionCode   ↓请求后端版本接口   ↓本地版本 < 线上版本?   ├── 否 → 进入首页   └── 是 → 显示更新弹窗            ↓      强制?→ 是 → 禁止关闭,必须下载安装            → 否 → 可选关闭,提示更新            ↓    安卓:下载apk → 安装 → 重启    iOS:跳转App Store

七、常见注意事项(避坑)

  1. 版本对比必须用 versionCode(数字)
    ,不要用版本名字符串
  2. 安卓必须配置安装、读写文件权限,否则无法安装
  3. 下载链接必须是 HTTPS(安卓 9 + 要求)
  4. iOS 不能实现自动更新,只能跳转商店(苹果硬性规则)
  5. 强制更新必须在首页加载前执行

总结

  1. Uniapp App 更新核心是版本号对比 + 分平台处理
  2. 安卓:全自动化(检测→下载→安装→重启)
  3. iOS:只能跳 App Store,无法本地安装
  4. 强制更新通过弹窗拦截实现,是最常用的业务需求
  5. 评论区点赞超过10w+,上demo链接
下一章节:
demo