你的 build 在 App Store Connect 里状态是 Ready to Test,已挂到外部测试 group。测试员确认收到并接受了邀请邮件。他在 iPhone 上打开 TestFlight App——你的 App 不在列表里。或者他看到了 App 但列出的版本是上一个,不是你昨天传的新 build。你自己设备上自然看到的是最新 build,复现不了。测试员卡住,测试周期也卡住。
“TestFlight build 不显示”几乎从来不是 build 坏了。几乎都是四件事之一:group 挂载、设备兼容性(iOS 版本、硬件)、邀请邮箱和 TestFlight 登录的 Apple ID 不匹配、测试员没在 TestFlight 里完成 Install 流程。按正确清单走一遍能修好 95% 的 case,不用重传任何东西。
常见原因
按命中率排序。
1. 测试员所在的 group 没挂这个 build
你有多个 TestFlight group(Internal、External-QA、External-Public)。你传的新 build 只挂到了 External-QA。测试员在 External-Public,看不到。
如何判断:App Store Connect → TestFlight → External Testing → 每个 group 看挂了哪些 build。测试员的 group 里必须有这个 build。
2. Build 最低 iOS 版本超过设备版本
build 编译的 IPHONEOS_DEPLOYMENT_TARGET = 17.0(或你用了 iOS 18 API),测试员的 iPhone 8 还在 iOS 16。TestFlight 把 build 过滤成不兼容,测试员看到 “No builds available”。
如何判断:让测试员看 Settings → General → About → iOS Version,和你 Xcode 项目的 deployment target 对照。不匹配就被过滤。
3. 设备硬件被支持设备列表排除
build 的 UIRequiredDeviceCapabilities(Info.plist)或排除架构筛掉了老 iPhone(比如要 Metal 3、ARKit、Neural Engine)。测试员硬件不在支持集里。
如何判断:读 Info.plist 的 UIRequiredDeviceCapabilities。只有 arm64 而测试员是 32 位老机(今天少见),或要求 gyroscope、metal 等设备没有的能力,都会被挡。
4. 邀请邮箱和 TestFlight 登录的 Apple ID 不一致
你邀请的是 tester@gmail.com。测试员接受了邀请,但 TestFlight 用 tester@icloud.com(个人 Apple ID)登录。TestFlight 按 Apple ID 精确匹配;邀请对其他 ID 不可见。
如何判断:设备上 TestFlight 右上头像看登录 Apple ID。和邀请邮件里的邮箱对照。
5. 测试员从邮件接受了邀请但没在 TestFlight 里点 Install
邮件里的 “View in TestFlight” 按钮把他带进 App,他看到 App 列表项但没点 Install——以为接受邀请就够了。Build 是 “available to test” 但实际没装。
如何判断:让测试员打开 TestFlight,在列表里找你的 App,看是不是还有蓝色 Install 按钮。
6. 测试员在 Apple Silicon Mac 上用 TestFlight,但你 iOS build 不允许
默认 iPhone App 能在 Apple Silicon Mac 上跑,除非你 opt out。你 opt out 了 Mac 测试员就看不到。
如何判断:App Store Connect → Pricing and Availability → iOS Availability on Mac。“Not Available” 就 Mac 测试员装不了。
7. 测试员之前拒绝过邀请
部分测试员点 “Decline” 或忽略了 TestFlight 通知。邀请进入 declined 状态,build 不显示。需要重发邀请。
如何判断:App Store Connect → TestFlight → External Testing → 点测试员看状态。“Declined” 就重发。
动手前先确认
- 至少另一个不同设备的测试员能看到 build,确认问题在测试员设备而不是 build 本身。
- 记录测试员精确设备型号、iOS 版本、Apple ID——没这些信息排查全是猜。
- 改 group 挂载前先备份当前挂载状态截图。
- 弄清问题是只在某一个测试员上出现还是多个,单个就是设备 / 账号问题,多个就是 group 挂载。
需要收集的信息
- 测试员设备型号 + iOS 版本(
Settings → General → About)。 - 测试员 TestFlight App 当前登录的 Apple ID。
- 你发出的邀请邮箱精确地址。
- 测试员所在 TestFlight group 以及那个 group 挂了哪些 build。
- 你 build 的 Minimum iOS Version 和 Xcode 里的支持设备清单。
最短修复路径
Step 1:核对 group → build 挂载
App Store Connect → TestFlight → External Testing → 测试员的 group:
- “Builds” 标签下应出现你要他测的 build。
- 没有就 ”+” → 选 build → Save。
- 内部测试:TestFlight → Internal Testing → ”+” → 选 build。
Step 2:核对兼容性
让测试员发 Settings → General → About → iOS Version 和设备型号。比对:
- Build 的
MinimumOSVersion≤ 设备 iOS 版本。 - Build 支持的设备包含这个型号。
你要 iOS 17+ 而测试员在 iOS 16,要么降目标版本,要么换台新设备的测试员。
Step 3:匹配 Apple ID
让测试员打开 TestFlight App → 右上头像 → 看登录的 Apple ID。和邀请邮箱对不上:
- 最简单:把邀请重发到他在 TestFlight 用的 Apple ID。
- 备选:让他从 TestFlight 登出,用邀请邮箱登入。
App Store Connect → TestFlight → External Testing → 点测试员 → Resend Invitation。
Step 4:让他刷新并安装
让测试员:
- 打开 TestFlight App。
- 下拉刷新 App 列表。
- 主列表 + “Previous Builds” 都看一下。
- 点 App → 点蓝色 Install 按钮。
Step 5:移除再重新邀请
Step 1-4 不行就把测试员从 group 移出再加回去,强制刷新邀请,清掉过期 Decline 状态。
App Store Connect → TestFlight → External Testing → 测试员 → ”…” → Remove → 确认。然后 ”+” → 重新加测试员。
Step 6:兜底让他重装 TestFlight
设备上删 TestFlight App,App Store 重装,用对的 Apple ID 登入,接受邀请邮件链接。重装通常能清掉 TestFlight 里干扰的状态。
怎么确认已经修好
- 测试员在 TestFlight App 列表里看到你的 App 和新 build 版本。
- 点 Install 能下载并打开 build,显示预期版本号条幅。
- Apple ID 和邀请邮箱都核对一致。
- App Store Connect 里 group + build 挂载都核对一致。
如果还是没修好
- 查 Apple System Status 有没有 TestFlight 故障——少见但真实,大型 OS 发布期更易出。
- 让测试员发 TestFlight Apps 列表截图;有时能看出测试员忽略的细节(“Previous Builds” 标签他没注意)。
- 把测试员加到另一个挂了同 build 的 group——单 group 状态偶尔会过期。
- 递增 build 号重传;少需要但其他都不行时能打破僵局。
预防建议
- 没必要就别提高
MinimumOSVersion。 - 邀请时把每个测试员的 Apple ID 记到仓库
TESTERS.md,方便后查不匹配。 - 内测 / 准生产测 / QA 各用单独 group,互不串扰。
- 每次挂新 build 后给测试员发一条确认(“应该看到 2.7 (48),没收到告诉我”),让他们主动确认。
- 别回收测试员邮箱;邮箱离开 group 后邀请状态会以意外方式保留。