上传 IPA 到 App Store 最烦的不是传得慢,是传完被退。进度条跑满那一下满心以为完事了,结果弹出一行 ERROR ITMS-90xxx,或者更糟——提示上传成功,可 App Store Connect 的构建版本里半天不见人影。
我自己这半年帮几个项目收尾上架,遇到的 IPA 上传 App Store 报错翻来覆去就那么几类。常见的场景大概是这几种:
- 进度走完,弹一行
ERROR ITMS-90189之类的红字,包没收下 - 显示上传成功了,可后台「活动 → 构建版本」里一直空着
- 改完一个报错重传,又蹦出另一个不同的 ITMS 码,来回折腾
说白了,这些退回基本逃不出四类:版本号/构建号、签名、图标资源、还有一类是"传上去了但静默不显示"。下面一类一类拆,每类配上真实报错原文和怎么查。用的工具是开心上架(Appuploader),它在 Windows、Linux 上都能把 IPA 直接提交 App Store Connect,不用 Mac 和 Xcode——但这里重点不是夸工具,是讲怎么定位。
一、版本号 / 构建号重复,ITMS-90189
这个是见得最多的。你改了几行代码重新打包上传,苹果直接甩回来:
ERROR ITMS-90189: "Redundant Binary Upload. You've already uploaded a build
with build number '5.0.0' for version number '1.3.1'."
意思很直白:同一个 Bundle ID 下,这个构建号(Build)已经传过一次了,哪怕你代码改过,苹果也当它是冗余二进制。App Store Connect 的规矩是——同一版本号下,构建号必须往上走,不能重复。
解决就是把 Build 号加一位。注意 Version(比如 1.3.1)和 Build(比如 5.0.0)是两个东西:版本号给用户看、构建号给上传校验用。你只想修个 bug 重传,Version 可以不动,把 Build 从 5.0.0 挪到 5.0.1 就行;要是整个版本都要覆盖,那 Version 也得比后台已有的高。
拿不准后台到底记了哪个号。用 Appuploader 的文件查看功能把要传的 ipa 拖进去,能看到它内嵌的实际版本信息;再去 App Store Connect 的版本列表对一眼,两边一比就知道该填几了。传的时候如果走的通道卡住,换个上传通道重试也是条路。
如果你是用命令行发版的,这一类其实能提前避掉。Appuploader 自带的 appuploader-cli build upload 在上传前会去对一遍 App Store Connect,构建号已经存在就当场提示、不会把同一个号硬塞上去。写进打包脚本收尾那一步,加个 --wait 让它等苹果处理完再往下走,CI 里连人工盯着都省了。我现在基本是本地出包手动传、流水线上走 CLI 两套并行,怎么顺手怎么来。
有个坑:Xcode 里改了版本号没真正生效,archive 出来的包还是旧号。改完务必重新 clean 一遍再打包,不然你以为改了,传上去还是同一个 build。
二、签名对不上,Invalid Signature 和证书类型错
签名类的报错花样多一点,但根子就一个——IPA 实际的签名信息,跟你提交用的账号、证书、Bundle ID 对不上。
几种常见情况:证书过期了;用的证书压根不属于当前这个账号;描述文件里的 Bundle ID 和 ipa 真实的 Bundle ID 不一致;还有一种特别隐蔽——拿开发证书打的包去上架,而上架必须用发布证书(Distribution)。这种错常常不当场报,是传上去之后苹果发邮件退回来的,邮件里写着"证书类型不正确"。
这类问题光看报错文案经常定位不到,得去核包本身。Appuploader 的文件查看模块把 ipa 拖进去,会列出这个包实际用的签名证书、内嵌的是哪个描述文件、Bundle ID 是什么。我一般就看三点:
- 签名证书是不是 Distribution 类型(不是就重新用发布证书签)
- 内嵌描述文件是不是 App Store 类型(Ad Hoc / 开发的都不行)
- ipa 的 Bundle ID 和你在后台建的 App 对不对得上
三点对齐,签名类的退回基本就解决了。证书到底过没过期,也在这儿看——把 p12 拖进去,有效期、Team ID、序列号都列着,顺手还能确认私钥跟证书是不是匹配的(不匹配的 p12 签出来的包必退,这坑我踩过)。要是证书真过期了,用 Appuploader 重新建一个发布证书、下载新的 p12 重签就行,不用翻钥匙串助手那套。描述文件那头,换了证书之后记得一键重建一下,它会自动带上当前有效的证书和已启用的设备,省得你手动去后台点。
顺带说一句,这个查看功能对做 App 备案也有用,p12 的 SHA1 指纹能直接复制出来。
三、图标不合规,ITMS-90704 和透明通道
图标这块苹果卡得挺死,两个高频报错。
一个是缺营销图标:
WARNING ITMS-90704: "Missing Marketing Icon. iOS Apps must include a
1024x1024px Marketing Icon in PNG format."
就是说包里必须有一张 1024×1024、PNG 格式、RGB 色彩空间的营销图标,少了它连审核都提交不了。有个地方容易弄混:工程里那些 192×192、128×128 的小尺寸是 App 内显示和各种资源用的,跟上架校验要的这张 1024 营销图标不是一码事,别以为切了一堆小图就齐活了,营销图标缺了照样退。
另一个是图标带了透明通道:
ITMS-90717: Invalid App Store Icon – The App Store Icon ... can't be
transparent nor contain an alpha channel.
App Store 图标不能透明、不能含 alpha 通道。解决办法也简单:把图标转成 JPG 会自动去掉透明层,或者用预览/图像工具导出时取消勾选 alpha 通道,再转回 PNG。还有个细节——图标保持正方形就行,圆角苹果会自己切,你要是手贱自己抠了圆角反而可能出问题(别问我怎么知道的)。
要是懒得一个个尺寸对,Appuploader 官网有个在线的 App 图标生成小工具,丢一张大图进去生成整套合规尺寸,能省掉不少手动导出的功夫。
四、传上去了,构建版本却不显示
这类最让人慌:没有任何报错,Appuploader 或者 Transporter 都提示上传成功,可 App Store Connect 的「活动 → 构建版本」里就是空的。
先别急着重传。两种可能:
一种是还在处理。苹果收到包要跑一遍处理,界面上会显示"正在处理",快的话十几二十分钟,赶上高峰排队几个小时也有。这种等就行了。
另一种是包有问题被静默退回。这时候去翻邮箱——登录 Apple ID 对应的邮箱,重点看垃圾箱,无论成功失败苹果都会发邮件,失败邮件里会写清楚原因(缺权限声明、证书类型不对之类的)。很多人卡这儿是因为压根不知道要去看邮件,干等后台刷新。
记住一条:上传成功 ≠ 构建版本可用。中间隔着苹果的处理和校验,出事它走邮件通知,不在上传工具里报。养成传完去瞄一眼邮箱的习惯,能少抓不少瞎。
几个工具怎么搭配
得说清楚,这些 ITMS 报错不是哪个上传工具的锅——它们是 App Store Connect 后端的统一校验,你用 Xcode、Transporter、命令行 altool 上传,撞上同样的问题照样吐同样的码。区别在排查顺不顺手。
纯 Mac 环境,Xcode 自带的 Organizer 上传、报错也在里面看,顺理成章。Transporter 胜在轻量,拖进去就传。而在 Windows、Linux 上,或者想把定位 ipa 签名这步并进来,Appuploader 的思路是上传前先让你把包看透——签名证书、描述文件、Bundle ID、版本号一屏列清楚,很多报错在传之前就能拦下来,不用等苹果退回再猜。真要接 CI 自动发版,它也有命令行 appuploader-cli build upload,打完包脚本里直接传。
按手头的环境挑就好,没有谁取代谁一说。
顺带一提,上面四类之外偶尔还会碰到 SDK 版本过低、用了被弃用的 UIWebView 这类报错,那些属于工程配置层面的事,跟上传工具没关系,照着苹果邮件里的提示改工程就行。真正高频、也最容易在上传环节自查掉的,还是版本号、签名、图标这三类——传之前花两分钟把 ipa 拖进去看一眼,比传完被退回来回折腾省事多了。