# App Update Check Protocol

本文档定义移动端应用更新检查协议，适用于 Android/iOS。

## 1. Endpoint

- Method: `GET`
- Path: `/api/v1/app/check-updates`

## 2. Request Query

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `platform` | `android` \| `ios` | 否 | 默认 `ios` |
| `channel` | `string` | 否 | 发布渠道，默认 `release` |
| `current_version_code` | `int` | 是 | 当前构建号（Android versionCode / iOS buildNumber） |
| `current_version_name` | `string` | 否 | 当前展示版本号（如 `0.1.1`） |

## 3. Response

```json
{
  "has_update": true,
  "update_type": "optional",
  "latest_version_name": "0.1.1",
  "latest_version_code": 2,
  "min_supported_version_code": 1,
  "download_url": "https://example.com/releases/social-app-android-v0.1.1+2-release.apk",
  "release_notes": "问题修复和体验优化",
  "file_name": "social-app-android-v0.1.1+2-release.apk",
  "file_size": 59768832,
  "sha256": "<sha256>"
}
```

## 4. Update Decision Algorithm

后端必须按以下顺序判定：

1. `current_version_code >= latest_version_code` -> `update_type = none`
2. `current_version_code < min_supported_version_code` -> `update_type = required`
3. 其他且 `< latest_version_code` -> `update_type = optional`

`has_update = (update_type != "none")`

## 5. Release Manifest

发布清单文件位置：`deploy/static/releases/manifest.json`

```json
{
  "releases": [
    {
      "platform": "android",
      "channel": "release",
      "version_name": "0.1.1",
      "version_code": 2,
      "min_supported_version_code": 1,
      "file_name": "social-app-android-v0.1.1+2-release.apk",
      "release_notes": "问题修复和体验优化",
      "file_size": 59768832,
      "sha256": "<sha256>"
    }
  ]
}
```

同一 `platform + channel` 可存在多条记录，服务端按 `version_code` 最大值选最新版。

## 6. Package Naming Convention

Android 安装包命名规范：

`social-app-android-v{versionName}+{versionCode}-{channel}.apk`

示例：

- `social-app-android-v0.1.1+2-release.apk`
- `social-app-android-v0.1.2+3-beta.apk`

规则：

- `versionName` 给用户展示（如 `0.1.1`）
- `versionCode` 必须严格递增
- `channel` 建议使用 `release` / `beta`

推荐打包命令：

```bash
./deploy/build-android-release.sh \
  --backend-host 115.190.63.157 \
  --channel release \
  --release-notes "问题修复和体验优化"
```

该脚本会：

- 按命名规范生成 APK 文件到 `deploy/static/releases/`
- 每次打包自动将 `apps/pubspec.yaml` 的 `buildNumber` 递增 1 并写回
- 自动更新 `deploy/static/releases/manifest.json`
- 输出版本号、文件路径和 SHA256

注意：

- `versionName`（如 `0.1.0`）由开发者手动维护
- `buildNumber`（如 `+2`）由打包脚本自动递增
