判定仍全在服务端算好下发,客户端只拿结论。规则: 1. Android / iOS 各一套版本号:app_release 加 ios_version / ios_min_version (启动 ALTER ... ADD COLUMN IF NOT EXISTS 幂等),原 version/min_version 只管 Android,平台由渠道号推导(只有 GlobalApple=101 是 iOS)。iOS 没填时**不回退 Android 的**——回退等于又回到共用一个版本号:Android 先发 1.0.3 而 iOS 商店还是 1.0.2 时,iOS 用户会被指向一个商店里没有的版本。 2. 最低支持版本留空 = 线上版本:勾上强更不填最低版本,就是「所有低版本都强更」; 填了则只强更低于它的,介于两者之间的仍是推荐。后台校验相应改成「至少填一个 平台的线上版本」。 3. 渠道行状态不是「已上架」(审核中/已下架)时不推送推荐更新——商店里还是旧包。 强更不受此限,它的地址会由回退链换成官方包。 4. 下载地址回退链:Android 渠道 = 本渠道(须已上架)→ 官方渠道(100) → 默认下载 地址;iOS / Google 只认本渠道,没有就空——那两处如今放的是 apk 直链。 5. 算不出任何地址时两种更新都不提示,强更也不例外:一个点了没反应又关不掉的 弹窗等于把用户锁死。 客户端三处配套:推荐更新的「稍后提醒」记住版本号,同一版本 24 小时内冷启动不再弹 (强更与手动检查不受影响);设置页手动检查绕过 10 分钟缓存;Android 上服务端地址 打不开时回退网页下载页(iOS 不兜底,那页给的是 apk)。 另修后台上传安装包报「必须先选择应用」:X-App-Id 头来自登录态的 currentAppId, 只有绑定了应用的运营/代理账号才有;超管在页面顶部选的应用只是个 app_name 字符串, 从不进请求头。现在 uploadFile 把它放进请求体,服务端没有 X-App-Id 时按 name / app_name 反查注册表补作用域。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>