你用 Xcode Organizer 或 Transporter 上传完成,看到绿勾,10 分钟后刷 App Store Connect,build 出现在 TestFlight → Builds,状态是 Processing。一小时过去还是 Processing。三小时过去:还是 Processing。没有错误邮件、没有拒回,旋转的小点之外没有任何进度。测试员今天等着 demo,你在纠结该再等还是该重传。
先建立一个判断框架:2026 年 Apple 的流水正常情况下是几分钟完成,不是几小时。所以一个 build 卡在 Processing 超过一小时,几乎总是静默失败了,或者在等你操作——它很少是”还在跑”。你要做的就是判断属于哪一种。
一句话总结
- 30 分钟以内: 正常。硬刷新再等。处理时间中位数大约 15–30 分钟。
- 卡住且看到黄色 “Missing Compliance” 横幅: 去答 Export Compliance 问题,或在
Info.plist里设ITSAppUsesNonExemptEncryption,以后就不会再问。这是最常见、也最容易避免的原因。 - 没横幅但超过 1 小时还卡: 查 Activity → All Builds 和上传者邮箱——多半是 “Invalid Binary” 失败了,而不是真的在挂。缺失或不全的隐私清单(
PrivacyInfo.xcprivacy)是 2024–2026 年最常见的静默失败原因。 - 真卡过 2 小时且毫无信号: 递增 build 号,重新 validate,用 Transporter 重传。
先判断你属于哪一种
动手前,先用你看到的现象对一下最可能的原因:
| 你看到的现象 | 最可能的原因 | 跳到 |
|---|---|---|
| 30 分钟内、没横幅 | 正常的 Apple 侧排队 | Step 1 |
| build 上有黄色 “Missing Compliance” 横幅 | Export Compliance 没答 | Step 3 |
收到 ITMS-91053 / ITMS-91061 邮件 | 隐私清单有缺口 | Step 5 |
收到 ITMS-90725 / “must be built with the iOS 26 SDK” 邮件 | 用了旧 Xcode/SDK 构建 | 用 Xcode 26 重新构建 |
| Activity 行显示 “Invalid Binary” / “Failed” | 静默拒回(点开看那一行) | Step 4 |
同一个 version (build) 已存在 | build 号冲突 | Step 6 |
| 没横幅、没邮件、过了 2 小时、状态页正常 | 真正的处理长尾 | Step 6 然后 Step 7 |
常见原因,按命中率排序
1. Apple 侧处理延迟(等就行)
最常见的情况:没出问题,Apple 流水繁忙。处理时间中位数 15–30 分钟;95 分位接近 90 分钟;高负载时长尾到 4–6 小时。WWDC 周(6 月中)、大版本 iOS 发布后几天、12 月假期都会拉长尾部。
如何判断: 没有特定信号——排除其他原因后剩下的就是它。查 Apple System Status,看 Apple 开发者论坛 同窗口有没有同症状的报告。
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. 隐私清单缺失或不全(2024–2026 年的头号原因)
从 2024 年 5 月 1 日 起,Apple 要求提供隐私清单(PrivacyInfo.xcprivacy),声明你对必填理由 API(如 UserDefaults、文件时间戳、磁盘空间、系统启动时间)的使用,以及为常用第三方 SDK 提供签名清单。这里有缺口,往往表现为 build 处理后失败——有时先在 Processing 短暂停留,有时直接发来一封 “ITMS-91053: Missing API declaration” 邮件,而不是一个干净的拒回。
如何判断: 在上传者邮箱里搜 ITMS-91053 或 ITMS-91061(“Missing privacy manifest”)邮件。在 Xcode 里 Product → Archive 后,用 Organizer 的隐私报告确认每个必填理由 API 和 SDK 都被覆盖。
4. dSYM 上传不全或符号化失败
带自定义或二进制 framework 的 build,上传后可能需要 dSYM 处理。这一步失败会让 build 卡在 Processing 而没有明确拒回。
如何判断: Xcode → Organizer → 你的 archive → 右键 → “Show in Finder” → 确认 .xcarchive 里有 dSYMs。Apple 匹配不上符号,处理就会停。
5. Build 触发额外自动审查
加了敏感 entitlement、大型新 SDK,或 binary 体积大幅增长,会让 build 走额外的自动扫描。一般 2 小时内完成,偶尔更久。
如何判断: 把这次 build 和上一个干净处理过的 build 做 diff。重大变化——新 entitlement、+50 MB IPA、新第三方 SDK——会增加几率。
6. Bundle ID、版本、build 号冲突
边缘 case:你传 1.2.3 (47),之前传过同样的 1.2.3 (47) 被丢弃了。Apple 可能把新上传停车,没有明确的 UI 提示。
如何判断: App Store Connect → Activity → All Builds。看同一个 version 下有没有更早的同 (build_number)。
7. Apple System Status 事故
真实但少见:TestFlight ingestion 或 processing 有正在进行的事故,整个集群的上传都被停。
如何判断: Apple Developer System Status——搜 TestFlight、App Store Connect、“Build Processing” 事故。
8. 用过旧的 Xcode / SDK 构建(2026 年新强制)
从 2026 年 4 月 28 日 起,App Store Connect 拒绝任何不是用 Xcode 26 / iOS 26 SDK 或更新版本构建的上传。这通常在上传时就以 ITMS-90725 弹回,而不是停在 Processing;但如果 CI runner 上还残留着 Xcode 16,可能产生一个能 ingest 然后失败的 build,短时间看起来像挂住。(注意:这里指的是构建用的 SDK 版本——你的 Deployment Target 仍可以是很旧的 iOS,App 照样能在老设备上跑。)
如何判断: 在上传者邮箱搜 ITMS-90725 / “must be built with the iOS 26 SDK” 邮件,并用 xcodebuild -version 确认构建机的 Xcode 版本。
动手前先收集这些信息
- App Store Connect → Activity 里的精确上传时间戳。
- Build 版本 + build 号。
- 你的 build 是否使用加密(
ITSAppUsesNonExemptEncryption的值)。 - 是否存在且完整的
PrivacyInfo.xcprivacy隐私清单。 .xcarchive里是否有 dSYM。- 上传时刻的 Apple System Status 快照。
最短修复路径
Step 1:等 30–60 分钟再硬刷新
硬刷新 App Store Connect(Cmd+Shift+R)。多数 “卡住” 只是没等够。在已知高负载窗口上传就把等待时间翻倍。App Store Connect 也会在浏览器里缓存过期状态——光是硬刷新就能解决相当一部分 “build 灰掉” 的报告。
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。
- 含 ITMS-91053 / ITMS-91061 的——隐私清单问题(见原因 3)。
- 含 ITMS-90725 或 “must be built with the iOS 26 SDK” 的——构建机用了过旧的 Xcode(见原因 8),改用 Xcode 26 重新构建。
Step 3:解决 Export Compliance
App Store Connect → TestFlight → 你的 build。看到 “Missing Compliance” 就点开,回答加密问题:
- App 是否使用加密? 多数 App 用——HTTPS 算。
- 加密是否豁免? 系统处理的标准 HTTPS / TLS 是豁免的。如果你只调
URLSession/HTTPS、用 Sign in with Apple 或 Apple Pay,或通过系统 TLS 连 Firebase / Supabase / Stripe,答案就是是,豁免。
回答完处理通常 5–10 分钟完成。
下次彻底免掉这一步,在 Info.plist 加:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
只用豁免/系统提供的加密时设 <false/>(对应 App Store Connect 里答 “No”)。只有当你真的发布非标准加密时才用 <true/>——那种情况你还要做年度自分类报告。
Step 4:查 Activity 看是否静默拒回
App Store Connect → Activity → All Builds。每行显示状态。如果你的 build 显示 “Invalid Binary” 或 “Failed Processing” 而不是 Processing,问题就在这——点开行看具体错误。多数 “卡了几小时” 的 build,到这一步会发现是失败了,不是在挂。
Step 5:如果是隐私清单的问题就修它
如果你收到 ITMS-91053/91061 邮件,就补全 PrivacyInfo.xcprivacy。对每个你用到的必填理由 API,在 NSPrivacyAccessedAPITypes 下加上 API 类别和一个获批理由。对 Apple 清单上的第三方 SDK,升级到一个自带签名清单的厂商版本,再重新 archive。
Step 6:递增 build 号重传
过了 2+ 小时仍无别的解释:
# 递增 CFBundleVersion
agvtool next-version -all
# Archive(自 2026 年 4 月 28 日起上传需要 Xcode 26 / iOS 26 SDK 或更新)
xcodebuild -workspace Acme.xcworkspace -scheme Acme \
-archivePath build/Acme.xcarchive archive
# 上传前 validate(秒级抓问题,不用等几小时)
xcrun altool --validate-app -f build/Acme.ipa \
-t ios --apiKey "$ASC_KEY_ID" --apiIssuer "$ASC_ISSUER_ID"
# 上传
xcrun altool --upload-app -f build/Acme.ipa \
-t ios --apiKey "$ASC_KEY_ID" --apiIssuer "$ASC_ISSUER_ID"
用 App Store Connect 的 API key(--apiKey/--apiIssuer)而不是 Apple ID 密码——专用密码正在被淘汰,基于 key 的认证是受支持的 CI 路径。重要的手动上传优先用 Transporter(Mac App Store 免费):它比 Xcode Organizer 暴露 validation 错误更清晰。
Step 7:还卡就提 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 挂载列表里。
- Build 上没有 “Missing Compliance”、“Invalid Binary” 或隐私清单横幅。
如果还是没修好
- 重新 archive 后先跑
xcrun altool --validate-app;本地抓到的 validation 错误比等 Apple 暴露快得多。 - 下次换 Transporter 上传——比 Xcode Organizer 报错更明确。
- 确认
Info.plist声明了全部必需 key:CFBundleShortVersionString、CFBundleVersion、UIApplicationSceneManifest(iOS 13+)、ITSAppUsesNonExemptEncryption。 - 确认
PrivacyInfo.xcprivacy存在,且 Xcode 隐私报告显示没有缺失声明。 - 试一个更小的测试 IPA(剥掉未用的 framework),排除体积导致的处理长尾。
预防建议
Info.plist始终设ITSAppUsesNonExemptEncryption(按实际填 true / false),让 Export Compliance 永远不卡处理。- 维护好
PrivacyInfo.xcprivacy;每次发版都看一眼 Xcode 隐私报告,并保持第三方 SDK 用自带清单的版本。 - CI 加预上传步骤
xcrun altool --validate-app;失败秒级暴露。 - 用 Xcode 26 / iOS 26 SDK 或更新版本构建——自 2026 年 4 月 28 日起这是所有 App Store Connect 上传的硬性要求。(仍停留在旧 Xcode 16 / iOS 18 SDK 的 build 现在会在上传时被拒,而不是卡在 Processing。)
- 避开 Apple 已知的高负载窗口(WWDC 周、大版本 iOS 发布日)上传。
- CI 用
agvtool next-version -all自动 bump build 号,避免冲突。
常见问题
2026 年 TestFlight 处理到底要多久? 通常 15–30 分钟,高负载时偶尔到约 90 分钟。超过一小时还没动静,就当作很可能是静默失败、而不是处理慢来对待,赶紧查 Activity 日志和邮箱。
我的 build 灰掉了但显示已处理,怎么回事? 几乎都是浏览器里的状态过期,或者你看的是另一个 build。硬刷新 App Store Connect,然后在 TestFlight 标签下用那一行的 “Manage” 流程确认这个具体 build 的真实状态。
ITSAppUsesNonExemptEncryption 是什么,该填哪个值?
它是 Info.plist 里预先回答 Export Compliance 问题的布尔值。只用系统提供/豁免的加密(如 HTTPS、Sign in with Apple、Apple Pay)就填 NO(<false/>)。只有当你发布自定义、非标准加密时才填 YES。
为什么我的 build 报 ITMS-91053 失败?
你的隐私清单缺了必填理由 API 声明。在 PrivacyInfo.xcprivacy 的 NSPrivacyAccessedAPITypes 里补上相应条目,或把触发它的第三方 SDK 升级到一个自带签名清单的版本。
我能不能直接重传?
不行。重传同一个 build 号一定会冲突。先诊断(Activity 日志 + 邮箱),确实要重传就先用 agvtool next-version -all 递增 build 号。
现在是不是必须用 Xcode 26?旧 build 会因此卡住吗?
是的——自 2026 年 4 月 28 日起,每个上传都必须用 Xcode 26 / iOS 26 SDK 或更新版本构建。用旧 Xcode 编译的 build 通常在上传时就被拒(ITMS-90725),而不是卡在 Processing;但 CI runner 残留旧版本时可能看起来像挂住。升级构建用的 SDK 不会改变哪些设备能装你的 App——那由 Deployment Target 决定,它仍可以设得很低。