TestFlight build 卡在 "Processing":6 个原因 + 解卡清单

上传到 TestFlight 的 build 几小时一直 Processing。常见原因:Apple 侧延迟(最常见,等就行);build 有问题(缺权限、签名错);需要设 ITSAppUsesNonExemptEncryption。先做:先等 1-2 小时——多数最终会完成。

你用 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” 横幅。

如果还是没修好

  1. 重 archive 前先跑 xcrun altool --validate-app;本地抓 validation 错误比等 Apple 暴露快。
  2. 下次用 Transporter(App Store 可下)上传——比 Xcode Organizer 报错更明确。
  3. 确认 Info.plist 声明全部必需 key:CFBundleShortVersionStringCFBundleVersionUIApplicationSceneManifest(iOS 13+)、ITSAppUsesNonExemptEncryption
  4. 试一个更小的测试 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。

相关阅读

标签: #排查 #App Store #App 审核 #TestFlight