iOS 16+
1

「关于我们」页面

用户入口 · 设置 → 关于我们 → 检测更新

9:41
BioAX 云模型
v2.6.0 (Build 260)
检测更新
NEW v2.6.0
用户服务协议
隐私政策
联系我们
1
1 检测更新行
点击触发 GET /api/version/check?platform=ios¤t=260
· 右侧 v2.6.0 显示当前版本;服务端返回有新版本时显示 NEW 红角标
· 检测中按钮置灰、显示 loading(菊花),防止重复点击
· 网络异常 Toast 提示「网络异常,请稍后重试」
2

已是最新版本

服务端 versionCode ≤ 客户端 · 居中 Toast 1.5s 自动消失

9:41
BioAX 云模型
v2.6.0 (Build 260)
检测更新
v2.6.0
用户服务协议
隐私政策
已是最新版本
v2.6.0 (260)
2
2 已是最新 Toast
条件:latest.versionCode ≤ current.versionCode
· 居中半透明黑底 + 绿色对勾 · 显示版本号方便用户截屏排查
· 1.5s 后自动消失,期间页面背景轻微变暗 35% 阻挡操作
· iOS 用 UIVisualEffectView,Android 用 Toast/自定义 Dialog
3

发现新版本(iOS)

命中新版本 · 弹窗确认 → 打开 App Store

9:41
BioAX 云模型
v2.6.0 (Build 260)
检测更新
NEW v2.6.0
用户服务协议
隐私政策
发现新版本
v2.7.0 (270) · 32.4 MB
新增 AI 图像增强模式,识别率 +18%
修复部分机型 Live Photo 闪退
优化样本检测耗时与电量消耗
3
4
3 发现新版本弹窗(UIAlertController 样式)
条件:latest.versionCode > current.versionCode
· 内容来自接口 data.releaseNotes[](数组,每行一条)
· 显示版本名+versionCode+包大小,让用户知情决定
· 字段 data.forceUpdate=true 时隐藏"稍后再说"按钮,弹窗不可关闭
4 「前往 App Store」按钮
调用 UIApplication.shared.open(URL)
· URL 取自接口 data.storeUrl(形如 itms-apps://apps.apple.com/app/idXXXXXXXXX
· 打开后弹窗保留,用户从 App Store 返回仍可点"稍后再说"关闭
· 「稍后再说」记录 24h 内不再主动检测(强制更新除外)
Android 13+
A1

「关于我们」页面

用户入口 · 设置 → 关于我们 → 检测更新

9:41
关于我们
BioAX 云模型
v2.6.0 (260)
检测更新
NEW v2.6.0
用户服务协议
隐私政策
A1
A1 检测更新行(Android)
点击触发 GET /api/version/check?platform=android¤t=260
· 流程与 iOS 一致;后台返回不同字段(downloadUrl 而非 storeUrl)
A2

发现新版本(Android)

命中新版本 · Material 3 弹窗 · 点击立即下载

9:41
关于我们
BioAX 云模型
v2.6.0 (260)
检测更新
NEW v2.6.0
用户服务协议
发现新版本
v2.7.0 (270) · 35.8 MB
新增 AI 图像增强模式,识别率 +18%
修复部分机型闪退问题
优化样本检测耗时与电量消耗
25.8 MB / 35.8 MB 72%
后台下载
A2
A2 Material 3 发现新版本弹窗
条件:latest.versionCode > current.versionCode
· 字段 forceUpdate=true 时隐藏「稍后再说」,弹窗不可关闭
· 点击「立即下载」后按钮变灰,弹窗内显示进度条,下载完成后按钮变「立即安装」
· 点击「后台下载」可最小化弹窗,通知栏显示下载进度
· 安装:FileProvider + Intent(ACTION_VIEW) 唤起系统安装器(Android 8+ 需 REQUEST_INSTALL_PACKAGES
A3

已是最新版本(Android)

服务端 versionCode ≤ 客户端 · Material Snackbar 3s 自动消失

9:41
关于我们
BioAX 云模型
v2.6.0 (260)
检测更新
v2.6.0
用户服务协议
隐私政策
已是最新版本
v2.6.0 (260)
A3
A3 Material Snackbar(已是最新)
条件:latest.versionCode ≤ current.versionCode
· 使用 com.google.android.material.snackbar.Snackbar
· 时长 LENGTH_LONG (3s),含「好的」action 可手动关闭
· 不阻塞页面操作;显示版本号方便用户截屏排查

接口与状态流转

单一接口 GET /api/version/check · 根据 platform 与 versionCode 分支

1

用户点击「检测更新」

GET /api/version/check ?platform=ios/android ¤t=260

请求参数:platform (ios/android)、current (当前 versionCode)、channel (可选灰度标识)

2

后端按平台匹配最新版本

SELECT * FROM versions WHERE platform=? AND status='published' ORDER BY version_code DESC LIMIT 1

后台分设备类型维护:Android 走自托管 downloadUrl,iOS 走 App Store storeUrl

3

返回结构一致

{ status: "update" | "latest", data: { versionName, versionCode, size, releaseNotes[], storeUrl | downloadUrl, forceUpdate } }

status=latest → Toast(屏 2/已是最新);status=update → 弹窗(屏 3/A2)

4

App 端分支处理

if (status === 'latest') { showToast() } else { showUpdateDialog() if (platform === 'ios') { open(storeUrl) // 屏 3 } else { // 弹窗内显示下载进度,完成后点击「立即安装」唤起系统安装器 startForegroundDownload(downloadUrl) then installWithFileProvider() } }

iOS 跳转 App Store;Android 弹窗内显示进度,下载完成后直接唤起系统安装