在 VSCode 里点一下,8 个商店同时传完了

88 阅读15分钟

本文是「告别手动发版」系列第 2 篇。

系列目录:

  • 第 1 篇:总览
  • 第 2 篇:VSCode 插件实战(本文)
  • 第 3 篇:CLI 实战与 CI/CD 集成
  • 第 4 篇:8 平台 API 踩坑实录

开始之前

安装 VSCode 扩展:市场搜索 "Flu CLI" → 安装。

打开方式:右键项目根目录 → Flu: 发布中心

open-publish-center.gif


三种发布模式

发布中心顶部有三个模式标签,按需选择:

mode-switching.gif

模式谁用做什么
🏗️ 仅构建Flutter 开发者编译出 APK/IPA,不上传
🚀 全量流水线Flutter 开发者编译 + 上传一气呵成
📦 仅上传所有 App 开发者有安装包直接传,不限框架

重点:如果你不是 Flutter 开发者,直接用"仅上传"模式。 打开发布中心后,如果检测到当前项目不是 Flutter 项目,界面会自动精简——模式标签和构建配置直接隐藏,只留上传相关的操作。


实战一:仅上传模式(所有开发者通用)

这是受众最广的模式。不管你用什么框架,只要有安装包就能用。

Step 1:选择安装包

select-package.gif

选文件的一瞬间,工具自动做了这些事:

格式自动解析用什么解析
APK包名 + 版本号 + 构建号aapt2 dump badging
IPABundle ID + 版本号 + 构建号plutil 解析 Info.plist
HAPBundle Name + 版本号解压读 module.json

不用手动填版本号,选文件就行。

Flutter 项目额外福利

如果你是 Flutter 项目,还有一个 "⚡ 一键同步" 按钮:

one-click-sync.gif 一个按钮做三件事:

  1. pubspec.yaml 读取包名和版本号
  2. 加载上次保存的密钥配置
  3. 扫描 build/ 目录,找到已编译的安装包

外部包自动识别

测试同事扔给你一个别人编译的 APK,包名和当前项目不一样——

external-package-mode.gif 界面自动切换:

  • 出现 "⚠️ 外部包模式" 标签
  • 工程设置隐藏(外部包不需要工程配置)
  • 版本号从安装包里解析,不读当前项目的 pubspec.yaml

删掉外部包后,界面自动切回工程模式。全程不需要手动切换。

Step 2:选择分发渠道

select-channels.gif

勾选你要上传的平台,右侧清单栏实时更新。

Step 3:配置密钥

这是第一次使用时最花时间的一步——但只需要配一次。

secrets-config-jb.gif

每个平台一张折叠卡片,展开后:

  • 输入框标注了需要填什么(Client ID、Secret 等)
  • ❓ 帮助按钮——点一下告诉你密钥在哪个后台、哪个页面申请,附官方文档链接
  • 保存方式三选一:
方式存在哪下次还在吗适合
⚡ 仅本次内存关掉就没了临时测试
📁 保存至本地项目配置文件日常使用(默认)
🌍 全局默认~/.flu-cli/config.json在,且跨项目多项目共享密钥

密钥存在本地,不提交 Git,不上传服务器。下次打开发布中心,自动加载。

各平台需要什么密钥

平台需要填什么在哪申请
蒲公英API Keypgyer.com/account/api
华为App ID + Client ID + Client SecretAGC 控制台 → 用户与权限 → API 客户端
小米邮箱 + 公钥证书小米开放平台 → 发布管理 → 自动发布设置
OPPOClient ID + Client SecretOPPO 开放平台 → 管理中心 → 应用详情
vivoAccess Key + Access Secretvivo 开放平台 → 管理中心 → API 接入
应用宝App ID + App Key腾讯开放平台 → 应用基本信息
App StoreApple ID + App 专用密码appleid.apple.com
鸿蒙Client ID + Client Secret同华为

这些信息,每个平台的 ❓ 帮助按钮点一下就能看到。不用收藏这个表。

Step 4:开始上传

upload-execution.gif 点击"开始执行任务",界面切换到 Dashboard 看板

左侧——每个平台一张任务卡片:

📤 上传任务
┌────────────────────────────┐
│ 🚀 蒲公英           [完成] │
│ 🤖 Android   ✅ 已上传     │
├────────────────────────────┤
│ 🏪 华为             [上传中] │
│ 🤖 Android   ████████░ 85% │
├────────────────────────────┤
│ 🏪 小米             [上传中] │
│ 🤖 Android   ██████░░░ 60% │
├────────────────────────────┤
│ 🏪 OPPO             [等待中] │
│ 🤖 Android   ░░░░░░░░ 0%   │
└────────────────────────────┘

右侧——动态详情面板,根据阶段自动切换。

底部——实时日志:

📤 将要上传到 4 个渠道
✅ 蒲公英上传完成 → 下载链接已生成
⬆️ 华为上传中 85%...
⬆️ 小米上传中 60%...
✅ 华为上传完成
✅ 小米上传完成
✅ OPPO 上传完成
🎉 全部上传完成!4/4 成功

Step 5:获取结果

上传完成后,结果面板显示:

  • 📊 成功/失败统计
  • 🔗 各平台下载链接 + 📋 一键复制
  • 🏪 前往后台 — 跳转到对应平台管理后台
  • 🔍 查看二维码 — 蒲公英专属
  • 📋 一键复制所有链接 — 全部链接打包复制,直接发群里

复制链接,丢群里,收工。


实战二:全量流水线模式(Flutter 专属)

Flutter 开发者的一条龙服务:编译 → 上传。

Step 1:配置

pipeline-config.gif 配置面板包含:

  1. 📁 工程设置 — 点"⚡ 一键同步"自动读取 pubspec.yaml
  2. 🏗️ 构建平台 — 勾选 Android / iOS
  3. 📝 版本策略 — 保持 / 修订 / 次版本 / 主版本
  4. 🌎 分发渠道 — 勾选要上传的平台
  5. 🔑 密钥配置 — 折叠式卡片,按需展开
  6. 📝 更新日志 — 支持按平台自定义

版本号递增策略:

策略当前 1.0.0+1 的结果
保持不变1.0.0+1
修订版本 (Patch)1.0.1+2
次版本 (Minor)1.1.0+2
主版本 (Major)2.0.0+2

Step 2:构建 → 确认 → 上传

pipeline-execution.gif 点击"开始执行任务"后:

选平台 + 选渠道 + 填版本号 → 开始
    ↓
🏗️ 编译(实时进度条)
    ↓
✅ 编译完成 → "是否开始上传?" [取消] [确认]
    ↓
📤 并行上传到所有渠道
    ↓
📊 结果汇总

编译完会停下来问你——万一编译成功了但你发现忘改什么东西,可以中断不传。不是无脑一路到底。


实战三:仅构建模式(Flutter 专属)

只编译出安装包,不上传。适合:

  • 先验证能不能编译通过
  • 出包给测试手动安装
  • 出包后稍后再用"仅上传"模式传

build-only-mode.gif 界面只保留构建相关的配置,分发渠道区直接隐藏。


失败了怎么办

单个平台失败

其他平台不受影响。失败的卡片变红,显示具体错误信息 + 🔄 重试按钮。

点一下只重试那一个,不用全部重来。

自动重试策略

底层内置了智能重试:

错误类型会自动重试吗说明
网络超时、连接拒绝✅ 会等 1s → 2s → 4s,最多 3 次
服务器 500/502/503✅ 会指数退避 + 随机抖动
限流 429✅ 会等待后重试
认证失败 401/403❌ 不会密钥错了,重试没意义
参数错误 400❌ 不会请求本身有问题

网络抖动不用管,工具自己会重试。密钥错了会直接告诉你,不浪费时间。


非 Flutter 项目的界面

如果你在一个非 Flutter 项目目录下打开发布中心:

non-flutter-ui.gif

  • 模式标签消失(构建用不了,所以不显示)
  • 工程设置消失(没有 pubspec.yaml
  • 只留核心操作:选文件 → 选渠道 → 配密钥 → 上传

界面越简单,上手越快。


上传后各平台会发生什么

建议收藏这张表,发版前看一眼:

平台上传后你还需要做什么
蒲公英直接可下载,生成二维码分享链接即可
华为默认存草稿(可配自动提审)去后台确认后提审,或配置 submit
鸿蒙同华为同华为
小米直接提交审核确认包没问题再传(无草稿状态)
应用宝直接提交审核确认包没问题再传(无草稿状态)
OPPO包和版本信息已提交建议去后台确认后提审
vivo包和版本信息已提交建议去后台确认后提审
App StoreIPA 传到 App Store Connect去后台选版本、填信息、提审

小米和应用宝没有草稿状态,上传即提审——确认包没问题再传。


配置文件:flu_release.yaml

如果你喜欢用配置文件管理(方便团队共享、CI/CD 场景),可以在项目根目录创建 flu_release.yaml

# 构建配置
build:
  android:
    type: apk # apk | appbundle
    flavor: # 可选:应用风味
    buildName: '1.0.0'
    buildNumber: '1'
  ios:
    scheme: Runner
    exportMethod: app-store # app-store | development | ad-hoc
    teamId: # 可选

# 发布配置
publish:
  pgyer:
    enable: true
    apiKey: 'your-api-key'

  huawei:
    enable: true
    appId: 'your-app-id'
    auth:
      clientId: 'xxx'
      clientSecret: 'xxx'
    releaseType: draft # draft(草稿)| submit(直接提审)

  xiaomi:
    enable: true
    auth:
      userName: 'xxx@example.com'
      privateKey: '/path/to/private.pem'

  app_store:
    enable: true
    auth:
      appleId: 'xxx@xxx.com'
      appPassword: 'app-specific-password'

# 重试策略
retry:
  maxRetries: 3
  initialDelayMs: 1000
  backoffMultiplier: 2

发布中心会自动加载这个文件,配置文件和可视化界面可以混用——文件里写了密钥,界面里就自动填上了。


小结

操作传统方式发布中心
上传 8 个平台逐个登录后台,2 小时勾选 + 一键,10 分钟
密钥管理到处找,经常忘配一次,自动加载
构建 + 上传手动跑命令 + 手动传一条龙,中间可暂停确认
失败处理全部重来单个重试
非 Flutter 项目一样要逐个传选文件直接传

下一篇预告

不喜欢 GUI?喜欢命令行?想集成到 CI/CD?

下一篇讲 app-ship CLI——npm install -g app-ship,一行命令传 8 个平台。


觉得有用?

  • 👍 点赞 — 让更多被发版折磨的人看到
  • 收藏 — 下个发版日翻出来用
  • 💬 评论 — 说说你被哪个平台折磨过

关注公众号「火叶」,第一时间获取系列更新和实战干货。回复 "flu" 加入开发者交流群。


「告别手动发版」系列 · 第 2 篇

完整文档 · 源码仓库 · VSCode 插件市场 · app-ship npm

公众号:火叶 · 交流群:微信 Huoye-TT 备注 "flu-cli"