很多人看到“一键上传”时,会觉得:
不就是把几个接口串起来吗?
真做完之后你会发现,根本不是。
你以为自己在发包。
其实你是在同时应付 8 套完全不像一家人的平台 API。
每个平台都能用一种不同方式折磨你
• 华为字段名会拐弯 • 小米 RSA 只能 117 字节一段 • OPPO 返回的域名和提交时认的域名还不一样 • vivo 上传和提交连请求格式都不是同一种 • 应用宝会让你绕开网关走 COS • App Store 会让你先去跟本机工具链和环境变量吵架 • 鸿蒙会把华为那套认证和字段坑继续带过来 • 蒲公英算相对清爽,但也要把链接和二维码结果处理好
所以自动上传最脏的活,不在按钮。
而在平台差异。
为什么 flu-cli 的一键上传,不是套个壳,而是真把脏活都做了一遍。
先看一眼,这 8 个平台到底哪里最烦

如果你是自己对接平台 API,这张表建议先当排障地图看。
不要一上来就把“上传失败”当成一个大问题。
先把它拆成 4 类:

这也是 flu-cli 要做的事:
不是让用户记住 8 套规则,而是尽量把这些差异提前收口。

4 类最常见的坑
坑 1:华为和鸿蒙,字段看上去像对的,实际会拐弯
华为和鸿蒙这条线,认证本身不算离谱,都是 OAuth2。
但最让人头疼的是:
• 认证返回里有时叫 access_token,有时又叫token• 文件关联接口里,地址字段可能写成 fileDestUlr
是的,不是 Url,是 Ulr。
如果你按文档里“理想中的字段名”去写,很容易在真实返回里撞墙。
这类坑最烦的地方在于:代码不是不会跑,而是你根本想不到对方会把字段名写错。

坑 2:小米不是上传难,是 RSA 又长又倔
小米的问题,不在于“要加密”。
而在于:
• 它用的是 1024-bit RSA • 单次加密上限就是 117 字节 • 文本一长,你就得自己分段
更离谱的是,它的公钥文件格式也不总是整齐的。
有的能直接用,有的要手动格式化,有的要做格式兼容。
再加一层:
小米 API 没有“草稿”这回事。
很多时候上传成功,就已经进入提审逻辑了。
这意味着你不是单纯在“测一下上传”。
你是在“很可能顺手就给它提了”。

坑 3:OPPO 和 vivo,看着像一类,细节却总在背刺你
这两个平台都不属于“完全没法接”的类型。
但它们很擅长把问题藏在细节里。
OPPO
OPPO 有两个很典型的问题:
• 上传返回的域名可能是 storedl1• 提交时却要换成 storedl
如果你不替换,前面都顺,最后照样挂。
另外,更新版本时有些线上字段必须先查回来再原样带上,不然很多必填项会在最后一刻把你拦住。
vivo
vivo 更像“格式陷阱”。
上传 APK 时,用的是 multipart/form-data。
但提交版本信息时,突然又变成 application/x-www-form-urlencoded。
也就是说:
同一平台,同一条链路,前后两步的请求格式都不一样。
这类坑最容易出现“明明签名没错,结果还是报错”的错觉。
因为真正错的可能不是签名,而是请求体格式。

坑 4:应用宝和 App Store,真正折磨你的是链路外的东西
应用宝
应用宝的典型问题是:
• API 网关有 30MB 限制 • 包一大,普通上传路径就不够用了 • 这时候要改走 COS 直传
而且它还要求你判断 APK 是纯 64 位,还是混合架构。
如果这个判断错了,最麻烦的是:
上传可能还成功,但审核会在后面拒你。
这就是最烦的那种坑:不是立刻炸,而是延迟给你补一刀。
App Store
App Store 的问题则完全是另一类。
它不是“上传接口有点难”。
它是:
• 你得先检测本机到底有没有 Transporter / altool • 有时候还得靠 bash -l -c才能把用户环境变量带进来• 工具链路径没拿到,命令就跑不起来
所以它难的不是 HTTP,而是本地工具环境。

这也是为什么“自动上传”不是套壳
真正值钱的,不只是少点几个按钮。
而是把这些本来会让用户自己挨一遍的平台毒打,提前接走。
如果你也做过 App 发版,最让你崩溃的平台是哪一个?
是认证最烦,还是报错最不像人话?
可以留言告诉我,我后面把某一个平台单独拆开写。
觉得有用?
• 👍 点赞 — 让更多被发版折磨的人看到 • ⭐ 收藏 — 下个发版日翻出来用 • 💬 评论 — 说说你被哪个平台折磨过
关注公众号「火叶」,第一时间获取系列更新和实战干货。回复 "flu" 加入开发者交流群。
完整文档 · 源码仓库 · VSCode 插件市场 · app-ship npm
公众号:火叶 · 交流群:微信 Huoye-TT 备注 "flu-cli"
夜雨聆风