你用 Xcode Organizer 或 Transporter 上传完成,看到绿勾,10 分钟后刷 App Store Connect,build 出现在 TestFlight → Builds 状态是 Processing。一小时过去还是 Processing。三小时过去:还是 Processing。没有错误邮件、没有拒回,旋转的小点之外没任何进度。测试员今天要 demo 同步,你在想该再等还是该重传。
Apple TestFlight 流水在上传后做多件事:资源提取、validation、dSYM 符号化、加密导出分类、App Store Server Notifications 注册。每步都有自己的失败模式,能让 build 停在 Processing 而 UI 不报错。绝大多数 10-60 分钟自己解决,但超过 2 小时就异常,值得动作。
常见原因
按命中率排序。
1. Apple 侧处理延迟(等就行)
最常见的情况:没出问题,Apple 流水繁忙。处理时间中位数 15-30 分钟;95 分位接近 90 分钟;高负载时长尾到 4-6 小时。WWDC 周、大版本 iOS 发布后几天、12 月假期都拉长尾部。
如何判断:没有特定信号——排除其他原因后倒推。查 Apple System Status、开发者社区有没有同窗口同症状的报告。
2. Info.plist 缺 ITSAppUsesNonExemptEncryption
Apple 要求每个 build 声明是否用非标准加密(Export Compliance)。Info.plist 没填 ITSAppUsesNonExemptEncryption 时 build 进入伪 Processing 状态等你在 App Store Connect 手动回答问题。
如何判断:App Store Connect → TestFlight → 你的 build → 看有没有黄色 “Missing Compliance” 横幅或 “Export Compliance” 链接让你答问题。
3. dSYM 上传不全或符号化失败
启用 bitcode 的 build(已弃用)或带自定义 framework 的 build 上传后可能需要 dSYM 重新符号化。这一步失败会让 build 卡在 Processing 而无明确拒回。
如何判断:Xcode → Organizer → 你的 archive → “Download Debug Symbols”。Apple 符号化不了,处理就停。
4. Build 触发额外自动审查
加敏感 entitlement、大型新 SDK、binary 体积大幅增长,会让 build 走额外自动扫描。一般 2 小时内完,偶尔更久。
如何判断:把这次 build 和上次成功处理的 build 做 diff。重大变化(新 entitlement、+50MB IPA、新第三方 SDK)会增加几率。
5. Bundle ID、版本、build 号冲突
边缘 case:你传 1.2.3 (47),之前传过同 1.2.3 (47) 被丢弃。Apple 可能把新上传停车,没有明确 UI 信息。
如何判断:App Store Connect → Activity → All Builds。看同 version 下有没有早一些的同 (build_number)。
6. Apple System Status 事故
真实但少见:TestFlight ingestion 或 processing 有当前事故,整个集群上传都被停。
如何判断:Apple Developer System Status——搜 TestFlight、App Store Connect、“Build Processing” 事故。
动手前先确认
- 上传后至少等 60 分钟再下”卡住”的定论;同 build 号重传保证失败。
- 在上传 Apple ID 邮箱里搜过 Apple 邮件,确认没有静默拒回。
- 改之前把当前 archive 备份本地。
- 弄清问题是只这一次还是反复——反复的 build 卡住可能是账号 / 配置问题。
需要收集的信息
- App Store Connect → Activity 里精确上传时间戳。
- Build 版本 + build 号。
- 你的 build 是否用加密(
ITSAppUsesNonExemptEncryption的值)。 - archive 里 dSYM 是否生成且在位。
- 上传时刻 Apple System Status 快照。
最短修复路径
Step 1:等 60 分钟再刷新
硬刷新 App Store Connect(Cmd+Shift+R)。多数 “卡住” 只是没等够。在已知高负载窗口上传就把等待翻倍。
Step 2:查上传者邮箱
搜上传 Apple ID 邮箱过去 4 小时邮件。标题搜:
- “App Store Connect: Your build is ready to test”(成功)。
- “App Store Connect: Your app build is invalid”(静默拒回)。
- “App Store Connect: Action required”(多半是 Export Compliance)。
垃圾箱比你想的更经常拦这类邮件。
Step 3:解决 Export Compliance
App Store Connect → TestFlight → 你的 build。看到 “Missing Compliance” 就点开。回答加密问题:
- App 是否用加密?多数 App 用(HTTPS 算)。
- 加密是否豁免?标准 HTTPS / TLS 豁免。
回答完处理通常 5-10 分钟完成。
下次彻底免掉这一步,Info.plist 加:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
(真用非标准加密就 <true/>,那种情况你要做年度自分类报告。)
Step 4:查 Activity 看是否静默拒回
App Store Connect → Activity → All Builds。每行显示状态。如果你 build 显示 “Invalid Binary” 或 “Failed Processing” 而不是 Processing,就是这个。点开行看具体错误。
Step 5:递增 build 号重传
过了 2+ 小时仍无别的解释:
# 递增 CFBundleVersion
agvtool next-version -all
# Archive
xcodebuild -workspace Acme.xcworkspace -scheme Acme \
-archivePath build/Acme.xcarchive archive
# 上传前 validate(更早抓问题)
xcrun altool --validate-app -f build/Acme.ipa \
-t ios -u "$ASC_USER" -p "@keychain:ASC_PASSWORD"
# 上传
xcrun altool --upload-app -f build/Acme.ipa \
-t ios -u "$ASC_USER" -p "@keychain:ASC_PASSWORD"
重要上传都用 Transporter——它比 Xcode Organizer 暴露 validation 错误更清晰。
Step 6:还卡就提 Feedback Assistant
真的卡了 4 小时以上仍无果:
- feedbackassistant.apple.com → New Feedback → App Store Connect。
- 附 build 版本、build 号、上传时间戳、Apple ID。
- Apple Developer Relations 偶尔会手动解卡 processing。
怎么确认已经修好
- Build 状态从 “Processing” 切到 “Ready to Submit” 或 “Ready to Test”。
- 收到邮件确认 build 可用。
- Build 出现在 Submit for Review 或 TestFlight group 挂载列表里。
- Build 上没有 “Missing Compliance” 或 “Invalid Binary” 横幅。
如果还是没修好
- 重 archive 前先跑
xcrun altool --validate-app;本地抓 validation 错误比等 Apple 暴露快。 - 下次用 Transporter(App Store 可下)上传——比 Xcode Organizer 报错更明确。
- 确认
Info.plist声明全部必需 key:CFBundleShortVersionString、CFBundleVersion、UIApplicationSceneManifest(iOS 13+)、ITSAppUsesNonExemptEncryption。 - 试一个更小的测试 IPA(剥掉未用 framework)排除体积导致的处理长尾。
预防建议
- Info.plist 总是设
ITSAppUsesNonExemptEncryption(按实际填 true / false),让 Export Compliance 永远不卡处理。 - CI 加预上传步骤
xcrun altool --validate-app;失败秒级暴露而不是几小时后。 - 避开 Apple 已知高负载窗口(WWDC 周、大版本 iOS 发布日)上传。
- CI 用
agvtool next-version -all自动 bump build 号,避免冲突。 - 订阅 Apple Developer 通知,时间敏感上传前先看 Apple System Status。