上次预告片说了句大话:"把手动发版这坨屎,交给 Flu CLI 打扫。"
华为要 OAuth2 换 Token,小米要 RSA 分段加密,OPPO 要 HMAC-SHA256 签名,vivo 要预算 MD5,苹果要装 Transporter......8 个平台,8 套认证,没有一个是一样的。
差点没疯。但总算跑通了,趁上线前先给大家交个底。
先说清楚:构建是 Flutter 专属,上传是所有人通用
这是发布中心最重要的设计决策------也是我最想让你知道的一点。
| 功能 | 谁能用 | 为什么 |
|---|---|---|
| 构建(编译出 APK/IPA) | Flutter 项目专属 | 底层调用 flutter build,离不开 Flutter 环境 |
| 上传(传到各平台商店) | 所有 App 开发者 | 只要有安装包,认证 + 上传的逻辑和框架无关 |
打包是各框架各管各的,但上传到商店这件事------每个平台一套 API、一套认证、一套字段格式------谁都要做,谁做都一样痛苦。我把痛苦的部分封装掉了。
一、上传:选文件就能传
Flutter 项目:一键同步
打开发布中心,切换到"仅上传"模式。

点"⚡ 一键同步",插件会做三件事:
- 读取项目包名和版本号 (从
pubspec.yaml) - 加载本地密钥配置(上次保存的密钥自动填充)
- 扫描
build/目录,找到已编译好的 APK/IPA/HAP,自动添加到资源包池

不用手动翻文件夹,不用手动填版本号,一个按钮全搞定。
非 Flutter 项目:一样能用
如果你当前目录不是 Flutter 项目(比如你是 Android 原生开发者),打开发布中心后界面会自动精简:

- 模式选项卡消失(构建功能用不了,所以不显示)
- 工程设置消失(没有
pubspec.yaml,所以不需要) - 只留"选择安装包"按钮------选文件 → 选渠道 → 上传
外部包:自动识别自动切换
测试同事扔给你一个别人编译的 APK,说"帮我传到蒲公英和华为"。
你选了这个 APK,插件检测到包名和当前项目不一样------

选包的一瞬间,这些事自动发生了:
- Header 出现"⚠️ 外部包模式"标签
- 工程设置面板自动隐藏------因为你传的是外部包,工程配置没有意义
- 版本号、包名直接从安装包里解析 ,不再读当前项目的
pubspec.yaml
版本号解析的底层逻辑:
| 格式 | 怎么解析 | 提取什么 |
|---|---|---|
| APK | Android SDK 的 aapt2 dump badging |
包名 + versionName + versionCode |
| IPA | macOS 原生 plutil 解析 Info.plist |
BundleID + 版本号 + 构建号 |
| HAP | 解压读 module.json |
bundleName + 版本号 |
aapt2 找不到? 自动降级到 aapt。还找不到?返回空值,不阻断流程------你依然可以手动填。
把安装包删干净后 ,界面自动切回工程模式,工程设置重新出现。整个过程不需要你手动切换任何东西。
三、密钥:配一次,自动加载,不用再翻聊天记录
每个平台需要不同的密钥才能调用 API。这是上传流程中最劝退人的一步------密钥名字不一样、后台入口不一样、认证方式不一样。
我们帮你封装了 8 种认证


| 平台 | 你填什么 | 底层帮你做什么 |
|---|---|---|
| 蒲公英 | API Key | 拼在请求里直接传 |
| 华为 | Client ID + Client Secret | OAuth2 换 Access Token → 获取上传 URL → 上传文件 → 更新版本信息 |
| 小米 | 邮箱 + 公钥证书 | 自动识别 X.509/PEM 格式 → RSA 分段加密(每段 117 字节)→ 计算 APK 的 MD5 → 签名验证 |
| OPPO | Client ID + Client Secret | 参数字典序排列 → HMAC-SHA256 签名 → 获取上传 URL → 上传 → 提交版本 |
| vivo | Access Key + Access Secret | 预计算 APK MD5 → MD5 签名 → 获取上传 URL → 上传 → 提交版本 |
| 应用宝 | App ID + App Key | HMAC-SHA256 签名 → 上传 APK → 提交版本信息 |
| App Store | Apple ID + App 专用密码 | 自动检测 Transporter CLI / xcrun altool → 上传 IPA |
| 鸿蒙 | Client ID + Client Secret | 复用华为 OAuth2 API → 上传 HAP |
你不需要知道 RSA 签名是什么、HMAC-SHA256 怎么拼。填密钥,剩下的插件处理。
密钥存在哪
| 级别 | 存在哪 | 适合谁 |
|---|---|---|
| ⚡ 仅本次 | 内存 | 临时测试 |
| 📁 保存至本地 | 项目目录配置文件flu_release.yaml(默认) | 日常使用 |
| 🌍 全局默认 | ~/.flu-cli/config.json |
多项目共用一套密钥 |
密钥存在本地,不提交 Git,不上传服务器。 下次打开发布中心,自动加载。
不知道密钥在哪申请?
每个平台旁边有 ❓ 帮助按钮,点一下:

直接告诉你在哪个后台、哪个页面、怎么操作,附官方文档链接。
不用去搜教程,不用问同事。
完整的密钥申请指南在文章最后,这里先继续说功能。
四、上传过程:并行上传 + 实时看板
勾选多个渠道后点"开始执行任务",所有渠道同时上传------不是传完一个再传下一个。
**左侧** --- 每个渠道一张任务卡片,实时进度条
右侧 --- 动态详情面板,根据阶段自动切换:
- 上传中:进度提示
- 全部完成:结果汇总
上传完成后

- 📋 复制链接 --- 一键复制下载地址
- 🏪 前往后台 --- 跳转到对应平台管理后台
- 🔍 查看二维码 --- 蒲公英专属
- 📋 一键复制所有链接 --- 把所有成功渠道的链接打包复制,直接发给同事
五、失败重试:坏一个不用全部重来
单个平台失败,其他平台不受影响。
失败的卡片变红,显示错误信息 + 🔄 重试按钮。点一下只重试那一个。
底层还有自动重试策略:
| 错误类型 | 会重试吗 | 说明 |
|---|---|---|
| 网络超时、连接拒绝 | ✅ 会 | 等 1s → 2s → 4s,最多 3 次 |
| 服务器 500/502/503 | ✅ 会 | 指数退避 + 随机抖动 |
| 限流 429 | ✅ 会 | 等待后重试 |
| 认证失败 401/403 | ❌ 不会 | 密钥错了,重试没意义 |
| 参数错误 400 | ❌ 不会 | 请求本身有问题 |
六、Flutter 专属:构建也在这
如果你是 Flutter 开发者,发布中心还有两个额外模式:
🏗️ 仅构建
选平台(Android / iOS / HarmonyOS)→ 选版本号策略 → 编译。不上传,只出包。
版本号递增策略:
| 策略 | 当前 1.0.0+1 的结果 |
|---|---|
| 保持不变 | 1.0.0+1 |
| 修订版本 (Patch) | 1.0.1+2 |
| 次版本 (Minor) | 1.1.0+2 |
| 主版本 (Major) | 2.0.0+2 |
🚀 全量流水线

编译 + 上传一条龙。流程:
css
选平台 + 选渠道 + 填版本号 → 开始
↓
🏗️ 编译(实时进度条)
↓
✅ 编译完成 → "是否开始上传?" [取消] [确认]
↓
📤 并行上传到所有渠道
↓
📊 结果汇总
编译完会停下来问你------万一编译成功了但你发现忘改什么东西,可以中断不传。
🚨 避坑指南:上传后各平台会发生什么
每个平台上传后的行为不一样,这是我们实际对接跑通后,用血和头发换来的整理,建议先收藏再看:
| 平台 | 上传后会怎样 | 你还需要做什么 |
|---|---|---|
| 蒲公英 | 直接生成下载链接 + 二维码 | 分享链接即可,无需审核 |
| 华为 | 默认存草稿(可配置 submit 直接提审) |
去后台确认后提审,或配置自动提审 |
| 鸿蒙 | 默认存草稿(同华为) | 同华为 |
| 小米 | 自动提交审核,没有草稿状态 | 等审核结果。确认包没问题再传 |
| 应用宝 | 自动提交审核,没有草稿状态 | 等审核结果。确认包没问题再传 |
| OPPO | 包 + 版本信息已提交 | 建议去后台确认后再提审 |
| vivo | 包 + 版本信息已提交 | 建议去后台确认后再提审 |
| App Store | IPA 传到 App Store Connect | 去后台选版本、填信息、手动提审 |
小米和应用宝的 API 没有草稿状态,上传即提审。 这是平台 API 设计决定的,不是我们的选择。华为和鸿蒙最灵活,可以在配置里选 draft(安全)或 submit(直接提审)。
💡 独家干货:密钥申请指南
每个平台的密钥在不同的地方申请,名字也不一样。我们对接时踩完坑,整理了这份表:
| 平台 | 需要什么 | 在哪申请 |
|---|---|---|
| 蒲公英 | API Key | pgyer.com/account/api → 直接复制 |
| 华为 | App ID + Client ID + Client Secret | AGC 控制台 → 用户与权限 → API 客户端 → 创建 |
| App Store | Apple ID + App 专用密码 | appleid.apple.com → App 专用密码 → 生成 |
| 小米 | 邮箱 + 公钥证书 | 小米开放平台 → 发布管理 → 自动发布设置 → 生成密钥对 |
| OPPO | Client ID + Client Secret | OPPO 开放平台 → 管理中心 → 应用详情 |
| vivo | Access Key + Access Secret | vivo 开放平台 → 管理中心 → API 接入 |
| 应用宝 | App ID + App Key | 腾讯开放平台 → 应用基本信息 |
App Store 上传需要本机安装 Transporter CLI 或 Xcode Command Line Tools(
xcrun altool),插件会自动检测。小米下载的是 X.509 格式证书(
dev.api.public.cer),插件自动处理格式转换。
这些信息,插件里每个平台的 ❓ 帮助按钮点一下就能看到。不用收藏这篇文章。
当前状态
| 平台 | 状态 | 认证方式 |
|---|---|---|
| 蒲公英 | ✅ 已验证 | API Key |
| 华为 | ✅ 已验证 | OAuth2 |
| OPPO | ✅ 已验证 | HMAC-SHA256 |
| App Store | ✅ 已验证 | Transporter + Apple ID |
| 鸿蒙 | ✅ 已验证 | OAuth2 |
| 小米 | ⏳ 代码完成,验证中 | RSA 签名 |
| vivo | ⏳ 代码完成,验证中 | MD5 签名 |
| 应用宝 | ⏳ 代码完成,验证中 | HMAC-SHA256 |
| TestFlight | ⚠️ 后续版本 | JWT (ES256) |
| Ad Hoc | ⚠️ 后续版本 | 签名证书 |
5 个已实际跑通,3 个代码写好了正在验证,2 个后续补上。
下一步
- 本周继续排雷,跑通小米、vivo、应用宝的最后细节
- 录制完整操作视频
- 测稳之后,下个大版本发布到 VSCode 插件市场
开发到这一步遇到不少坑
除了这 8 个平台,你们平时发版还被哪个平台折磨?评论区告诉我,呼声高的我们直接列入下期开发计划!
想第一时间体验正式版,先 安装 Flu CLI 插件,发布中心会在下个大版本推送。
有什么想问的,随时交流。🐟
觉得有用?一键三连支持一下:
- 👍 点赞 --- 让更多开发者看到
- ⭐ 收藏 --- 下次发版时翻出来用
- 💬 评论 --- 说说你被哪个平台折磨过
- 🔔 关注 --- 后续还有实战踩坑系列
Flu CLI · 让 Flutter 开发少一点折腾 完整文档 · 源码仓库 · VSCode 插件市场