你的 build 在 App Store Connect 里状态是 Ready to Test,已挂到外部测试 group。测试员确认收到并接受了邀请邮件。他在 iPhone 上打开 TestFlight App——你的 App 不在列表里。或者他看到了 App,但列出的版本是上一个 build,不是你昨天传的那个。你自己设备上一直看到的是最新 build,复现不了。测试员卡住,测试周期也卡住。
最快的修法: 打开 App Store Connect → TestFlight → 测试员所在的 group → Builds,确认新 build 确实挂在这个 group 上,然后让测试员打开 TestFlight 下拉刷新、点 Install。这一步能解决最常见的情况。如果 build 已经挂着,再按下面的表格往下排查。
“TestFlight build 不显示”几乎从来不是 build 坏了。常见就那么几种:build 没挂到测试员的 group、build 还在 Beta App Review、测试员没被通知、设备不兼容(iOS 版本或硬件)、邀请邮箱和 TestFlight 登录的 Apple ID / 地区不匹配、测试员没在 App 里点 Install。按对的清单走一遍,绝大多数情况都不用重传任何东西就能修好。
你属于哪一类
用这张表跳到对应小节。
| 测试员反馈的现象 | 最可能的原因 | 小节 |
|---|---|---|
| TestFlight 列表里根本没有这个 App | build 没挂到他的 group,或邀请 / Apple ID 不匹配 | 1、5 |
| App 下面写 “No builds available” | iOS 版本太低、硬件被排除,或地区不匹配 | 2、3、6 |
| 看到的是旧 build,不是新的 | build 还在 Beta App Review,或测试员没被通知 | 4、8 |
| 收到了邮件但什么都没装上 | 没点 Install,或之前拒绝过 | 7、9 |
| Mac 测试员什么都看不到 | iOS App 在 Mac 上的可用性被关掉了 | 10 |
常见原因
按命中率排序。
1. build 没挂到测试员所在的 group
你有多个 TestFlight group(Internal、External-QA、External-Public)。新 build 只挂到了 External-QA。测试员在 External-Public,于是什么都看不到——或者只看到这个 group 还留着的旧 build。
如何判断:App Store Connect → TestFlight → 侧边栏 → 测试员的 group → Builds。你要他测的 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 对照。设备 iOS 版本低于 build 的 MinimumOSVersion 就会被过滤。
3. 设备硬件被支持设备列表排除
build 的 UIRequiredDeviceCapabilities(Info.plist)会筛掉缺少某项能力的设备——比如要求 metal、gyroscope、arkit。测试员的硬件不在支持集里,TestFlight 就把 build 藏起来。
如何判断:读 Info.plist 的 UIRequiredDeviceCapabilities。如果你要求的能力测试员设备没有,就会被过滤。App Store Connect 在 build 详情页也会列出该 build 支持的设备清单。
4. build 还在 Beta App Review(尚未通过审核)
外部测试需要 Apple 的 Beta App Review:每个版本的第一个 build、以及改动较大的 build 都要过审。审核通过前,外部测试员看不到这个 build,哪怕它上传得好好的。内部测试员(你的 App Store Connect 用户)可以在过审前就测;外部测试员不行。
如何判断:App Store Connect → TestFlight → 这个 build。如果状态是 In Review、Waiting for Review 或 Rejected,而不是 Ready to Test / Testing,那外部测试员看不到就是这个原因。build 审核通常一天左右出结果,大型 OS 发布期会更久。
5. 邀请邮箱和 TestFlight 登录的 Apple ID 不一致
你邀请的是 tester@gmail.com。测试员接受了,但用 tester@icloud.com(个人 Apple ID)登录 TestFlight。TestFlight 把邮件邀请绑定到收件的那个 Apple ID 上;对其他 ID 不可见。
如何判断:设备上打开 TestFlight → 右上头像 → 看登录的 Apple ID,和邀请邮件里的精确地址对照。测试员只能在收到邀请的那个 Apple ID 下看到它。
6. 地区 / storefront 或年龄分级限制
如果你的 App 只在部分地区可用,或 build 的年龄分级高于测试员账号能访问的范围,即使测试员接受了邀请,build 也可能在他那个 App Store storefront 下被过滤掉。
如何判断:App Store Connect → App Information / Pricing and Availability 看地区可用性,以及 build 的年龄分级。确认测试员设备的 App Store 地区(Settings → [他的名字] → Media & Purchases → View Account → Country/Region)在你 App 覆盖的范围内。
7. 测试员接受了邀请但没点 Install
邮件里的 “View in TestFlight” / “Start Testing” 按钮把他带进 App。他看到了 App 列表项,但没点 Install——以为接受邀请就够了。build 是 “available to test” 但实际没装。
如何判断:让测试员打开 TestFlight,在列表里找你的 App,看是不是还有蓝色 Install 按钮。
8. build 挂上了但测试员没被通知
往 group 里加 build 时,Automatically notify testers 这个勾选框决定测试员会不会收到推送 / 邮件提醒。如果没勾(或者 build 是在过审前就加进去的),测试员可能根本没被提醒,也就不会想到去看。不管有没有通知,最后都要在 TestFlight 里手动 Install。
如何判断:App Store Connect → TestFlight → 这个 build → 看测试员有没有被通知过。build 过审后可以用 Notify Testers 手动触发一次。
9. 测试员之前拒绝过邀请
部分测试员点了 “Decline” 或忽略了 TestFlight 通知。邀请进入 declined 状态,build 就不显示。需要重发邀请。
如何判断:App Store Connect → TestFlight → 这个 group → 点测试员 → 看状态。Declined 就重发,或移除后重新加。
10. 测试员在 Apple Silicon Mac 上,而你的 iOS build 不允许
默认情况下,兼容的 iPhone / iPad App 可以在 Apple Silicon Mac 上跑,除非你 opt out。你 opt out 了,Mac 测试员就什么都看不到。
如何判断:App Store Connect → Pricing and Availability → iOS App 在 Mac 上的可用性开关。如果设成不可用,Mac 测试员就装不了。
需要收集的信息
动手改之前,先从测试员那里拿到这些(在这一步靠猜,会白白多跑一整轮):
- 设备型号和 iOS 版本(
Settings → General → About)。 - TestFlight App 当前登录的 Apple ID(右上头像)。
- 你的邀请发到的精确邮箱地址。
- 他在哪个 TestFlight group,以及那个 group 挂了哪些 build。
- 你 build 的
MinimumOSVersion和支持设备(Xcode / build 详情页)。
另外确认是一个测试员还是多个出问题。一个测试员通常是设备、Apple ID 或地区问题;多个则指向 group 挂载、审核状态或通知。
最短修复路径
Step 1:核对 group → build 挂载
App Store Connect → TestFlight → 侧边栏 → 测试员的 group → Builds:
- 你要他测的 build 应该列在这里。没有就点 Add Builds,选 build,确认。
- 也可以直接打开这个 build(Builds → 平台 → 该 build),在 Groups 旁点加号(+)把 group 挂上去。
- 内部测试员同理,把 build 挂到 Internal Testing group。
Step 2:确认已过 Beta App Review
在 TestFlight 里打开这个 build。外部测试员只有在状态是 Ready to Test / Testing 时才看得到。如果是 Waiting for Review、In Review 或 Rejected,那就是卡点——等审核通过(通常一天左右)或修掉被拒原因。外部审核还在进行时,内部测试员可以先测。
Step 3:核对兼容性
让测试员发 Settings → General → About → iOS Version 和设备型号,然后比对:
- Build 的
MinimumOSVersion<=设备 iOS 版本。 - Build 支持的设备包含这个型号。
你要 iOS 17+ 而测试员在 iOS 16,要么降 deployment target,要么换台新设备测。
Step 4:匹配 Apple ID、地区,然后重发
让测试员打开 TestFlight → 右上头像 → 确认登录的 Apple ID。和邀请地址对不上时:
- 最简单:把邀请重发到他在 TestFlight 实际用的 Apple ID。
- 备选:让他从 TestFlight 登出(头像 → Sign Out),用邀请邮箱重新登入。
同时确认设备的 App Store 地区在你 App 覆盖范围内。重发方式:App Store Connect → TestFlight → 这个 group → 点测试员 → Resend Invitation。
Step 5:确认已通知,再刷新安装
如果加 build 时 Automatically notify testers 没勾,在已过审的 build 上点一次 Notify Testers。然后让测试员:
- 打开 TestFlight App。
- 下拉刷新 App 列表。
- 主列表和 Previous Builds 都看一下。
- 点 App,再点蓝色 Install 按钮。
Step 6:移除再重新邀请
Step 1–5 都不行,就把测试员从 group 移出再加回去,强制刷新邀请,清掉过期的 Declined 状态。
App Store Connect → TestFlight → 这个 group → 测试员 → 移除 → 确认。然后重新加测试员。
Step 7:兜底——重装 TestFlight
删掉 TestFlight App,从 App Store 重装,用对的 Apple ID 登入,再次点开邀请链接接受。重装通常能清掉本地那点干扰 TestFlight 的状态。
怎么确认已经修好
- 测试员在 TestFlight App 列表里同时看到你的 App 和新 build 版本。
- 点 Install 能下载并打开 build,显示预期的版本 / build 号条幅(比如
2.7 (48))。 - Apple ID、邀请邮箱、App Store 地区全部一致。
- App Store Connect 里 group + build 挂载已核对,状态为 Ready to Test。
常见问题
挂上 build 后多久测试员能看到?
外部测试员要等 build 过 Beta App Review——通常提交后一天左右,大型 OS 发布期更久。一旦状态变 Ready to Test 且测试员已被通知,他们在 TestFlight 里下拉刷新后几分钟内就该看到。
build 明明挂上了,为什么测试员还是 “No builds available”?
这条提示意味着 TestFlight 把该设备的所有挂载 build 都过滤掉了——基本是最低 iOS 版本或硬件能力不匹配(第 2、3 节)、地区 / storefront 限制(第 6 节),或 build 还没通过外部测试审核(第 4 节)。
测试员必须用我邀请的那个 Apple ID 吗?
是的。邮件邀请只在收件的那个 Apple ID 下可见。如果他用别的 Apple ID 登 TestFlight,要么把邀请重发到那个 ID,要么让他切换(第 5 节 / Step 4)。
我能加多少测试员?build 会过期吗?
截至 2026 年 6 月,TestFlight 每个 App 最多 10,000 名外部测试员、100 名内部测试员(App Store Connect 用户)。build 自上传起最多可测 90 天,之后过期,要换成更新的 build。
测试员在 Mac 上什么都看不到,正常吗?
兼容的 iPhone / iPad App 默认能在 Apple Silicon Mac 上跑,但你可以在 Pricing and Availability 里 opt out。如果你 opt out 了,Mac 测试员就装不了——改让他在 iOS 设备上测(第 10 节)。
如果还是没修好
- 查 Apple System Status 有没有 TestFlight 故障——少见但真实,大型 OS 发布期更易出。
- 让测试员发 TestFlight Apps 列表截图;往往能看出他忽略的细节(Previous Builds 标签、登错的 Apple ID)。
- 把测试员加到另一个挂了同 build 的 group——单个 group 的状态偶尔会过期。
- 递增 build 号重传。少需要,但其他都不行时能打破僵局。
预防建议
- 没必要就别提高
MinimumOSVersion,除非代码真的需要更新的 API。 - 邀请时把每个测试员的 Apple ID 记下来(仓库里放个
TESTERS.md就行),方便后查不匹配。 - 留一个专门的”准生产”外部 group,和内部测试员、QA 分开,这样 build 挂哪儿一目了然。
- 保持 Automatically notify testers 勾选,并在每个新 build 后发一句确认(“应该看到 2.7 (48),没收到告诉我”),让测试员主动确认。
- 别回收测试员邮箱;邮箱离开 group 后,邀请状态会以意外方式保留。