TestFlight 是 Apple 免费的 beta 测试服务。每个 iOS 独立 App 都应该在提审前跑一轮 TestFlight——不是 Apple 强制,而是它能在真审核员打开你的二进制之前,先在真设备上抓出那些会让你被拒的签名、内购、entitlement bug。
一句话总结
- TestFlight 免费,内置在 App Store Connect 里。两条赛道:最多 100 个内部测试者(即时可测、不审核)和最多 10,000 个外部测试者(每个版本的第一个 build 要先过 Beta App Review)。
- 每个 build 可测 90 天,过期后必须发新 build。
- 上传可以走 Xcode(Archive → Distribute)或命令行。
xcrun altool仍能上传,但 Apple 现在更推荐独立团队用 Transporter + App Store Connect API key,而不是用 Apple ID 密码。 - 你拿到的反馈质量,取决于你写的”What to Test”。写 3-5 条具体要测什么,而不是”测一下新版本”。
- beta 活跃期间每 2-5 天发一个新 build。停滞的 beta 会死——测试者会忘了手机上还装着它。
TestFlight 到底给你带来什么
对独立开发者,价值有两块。一是逼你把一个真正的分发 build 走一遍 Apple 工具链,把那些在你自己手机上跑 debug build 永远不会暴露的 IAP、代码签名、profile bug 提前翻出来。二是让 App 在别人的设备上、真实条件下跑起来——不同的 iPhone 机型、更老的 iOS 版本、不稳定的网络——在审核员(和你的付费用户)看到之前。
它不是什么:上线渠道或营销渠道。TestFlight 用户是测试者不是用户,上线时不会转化成 App Store 下载,build 过期后安装链接也会失效。
TestFlight 各项上限一览(2026 年 6 月)
| 项目 | 上限 / 行为 |
|---|---|
| 内部测试者 | 最多 100 个 App Store Connect 用户(角色:Account Holder、Admin、App Manager、Developer、Marketing) |
| 外部测试者 | 每个 App 最多 10,000 个 |
| Beta App Review | 外部组每个版本的第一个 build 要审;内部组不用审 |
| 审核时长 | 一般不到 24h,常见几小时;Apple 不给 SLA 承诺 |
| build 有效期 | 上传后 90 天,之后过期 |
| 每个 App 的 build | 每组一个”当前”build,但测试者能从近期 build 里挑 |
| Public Link 上限 | 同样是 10,000 的天花板,满了只能停用整个组 |
| 费用 | 有 Apple Developer Program 会员即免费(2026 年 6 月为每年 $99) |
来源:Apple 在 App Store Connect 帮助文档中的 TestFlight 概览。
什么时候可以开始
- 已经有一个能编译、至少能在你自己设备上跑通的 build。
- 距离提审还有 1-3 周。
- 至少有 3-5 个真的会用这个 App 的人。
- 有任何方式收反馈(邮件、Discord、表单都行)。
实操步骤
1. archive 并上传
Xcode 操作流程:
1. 选 device target:Any iOS Device (arm64)(不能选模拟器)
2. Product → Archive(5-15 分钟)
3. 弹出的 Organizer 里 → "Distribute App" → "App Store Connect" → "Upload"
4. 选 signing:Automatically manage signing(除非你公司用 manual cert)
5. 等上传完成(10-30 分钟,取决于 build 大小和网速)
命令行也可以(如果你不想用 Xcode UI)。注意:用 Apple ID 密码的 altool 是老路子,Apple 现在更推荐用 Transporter + App Store Connect API key(在 Users and Access → Integrations 里生成的一个 .p8 文件)。截至 2026 年 6 月两种都还能上传:
# Archive
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp \
-configuration Release -archivePath build/MyApp.xcarchive archive
# Export ipa
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist -exportPath build/
# 用 API key 上传(推荐)
xcrun altool --upload-app -f build/MyApp.ipa -t ios \
--apiKey ABC123XYZ --apiIssuer 11111111-2222-3333-4444-555555555555
2026 年起必须用 Xcode 14 或更新版本上传。常见上传失败:bundle ID 与 App Store Connect 不一致、缺 push notification entitlement、或 Info.plist 缺某个必填的用途说明键(比如 NSLocationWhenInUseUsageDescription)。
2. 等 build 处理完
在 App Store Connect → TestFlight → Builds 看状态:
Uploading 上传中
Processing Apple 后台处理(5-30 分钟)
Ready to Test ← 处理好了
Invalid Binary ← 失败,看 Apple 发的错误邮件
Missing Compliance ← 缺加密合规答案,去 build 详情页填
碰到 “Missing Compliance”,大部分 App 选 “No, encryption used is exempt”——纯 HTTPS 算豁免加密。你也可以在 Info.plist 里把 ITSAppUsesNonExemptEncryption 设成 false,免得每个 build 都弹这个问题。
3. 配 Internal Testing 组(最多 100 人,无审核)
App Store Connect → TestFlight → Internal Testing → "+"
- Group Name: Internal QA
- Test Information:
- Beta App Description: 这次重点测什么
- Email: 你的反馈邮箱
- Add Testers: 选 Account Holder + Developer 角色的人
- Enable for Build: 选刚处理好的 build → Save
邀请发出后立刻能在 TestFlight App 装。注意:用免费 Apple ID 的测试者跑不了沙盒内购——你的团队需要沙盒测试账号(在 Users and Access → Sandbox 里建)。
4. 配 External Testing 组(最多 10,000 人)
每个版本的第一个新 build 要走 Beta App Review(一般不到 24h,常见几小时):
App Store Connect → TestFlight → External Testing → "+"
- Group Name: Public Beta(或细分如 "Power Users")
- Add Testers: 邮箱手填、CSV 导入,或开 Public Link
- Build to test: 选 build
- Submit for Beta App Review:
- Beta App Description: ≤4000 字符,可复用 App Store 描述
- What to Test: 这一版重点测什么(见步骤 5)
- Demo account: 如果需要登录
- Notes: 任何审核员需要知道的特殊事项
5. 写一份真正的”What to Test”
别写”测试所有功能”——写 3-5 条具体反馈点:
差:"请帮我测试这个新版本"
好:
本版本测试重点:
1. 新的 onboarding(前 60 秒):新用户能不能在不看任何说明的情况下完成初次设置?
2. iPad 横屏:旋转设备后 21 天日历是否还能完整显示?
3. Family Sharing:和家人共享时,对方收到推送的延迟是否在 30 秒内?
4. 内存:连续使用 30 分钟后,App 是否会变卡或被系统杀掉?
不需要测试:
- 设置页(与上一版无变化)
- 详细图表(已知 bug,已在 v1.1.1 修)
6. Public Link 慎用
开启位置:External Testing 组详情 → “Enable Public Link”。
优点:拿到链接谁都能装(最多 10,000)
缺点:
- 名额满了无法清空,只能停用整个组
- 可能被 bot 爬取占名额
- 不实名,反馈质量低
推荐:私链邀请 + Discord 收集邮箱 → 你手动加到 External Testers
7. 搭好反馈通道
每种各做一个,分别引导到不同场景:
TestFlight 内置反馈:
测试者截图后选 "Send to Developer",自带 device / OS / build 元信息
在 App Store Connect → TestFlight → Feedback 看
邮件:
"What to Test" 里贴 beta@yourdomain.com,方便测试者直接贴 stack trace
Discord / Slack 频道:
长期 beta 群,每发一次 build 在频道里 @everyone
崩溃上报:
beta 开始前就接好 Sentry 或 Crashlytics
在 App Store Connect → TestFlight → Crashes 看(但 Sentry 一般实时性更好)
8. 保持 2-5 天的节奏
停滞的 beta 会死——测试者会忘了手机上还装着它。
节奏建议:
D0 首个 build
D2 修第一波明显 bug,发 v1.0.1
D5 功能小迭代 + 修第二波,发 v1.0.2
D7 全面测试,准备提审
每次新 build 推送时,TestFlight 会自动给所有测试者发通知 + What’s New 文案。
9. 提审前跑最后一个 build
用准备正式提交的 metadata(截图、关键词、描述、隐私答案)再走一遍 External:
目的:
- 让 5-10 个真用户用接近正式版的体验跑 24h
- 抓最后一公里的问题:图标在某些设备上渲染异常、IAP 从沙盒切到生产、
推送 token 在 Production 环境注册失败
完成后才把同一个 build 在 "Add for Review" 提到 App Review。
容易踩的坑
- 把 TestFlight 当上线渠道。 测试者不是用户,上线时不会转化。
- 加 “test123” 这种占位假账号。 假用户出不来有用反馈。
- build 过期不知道。 build 上传后 90 天过期,beta 跑更久就得发新 build。
- 不在沙盒里测 IAP。 TestFlight 用沙盒 StoreKit,不是生产环境——购买必须用沙盒账号测。
- Beta App Review 备注里漏写测试者范围。 Apple 真会读。
- 最后一刻才接崩溃日志。 开 beta 前就接好 Sentry 或 Crashlytics,否则崩溃报告没意义。
这篇适合谁
准备发布第一款 App、或要发大版本升级的所有独立 iOS 开发者。
这篇不适合谁
简单到 30 分钟自测就能覆盖所有问题的 App——这种比你想象的少。
FAQ
- 需要多少测试者? 独立 App 一般 5-15 个活跃测试者就够了。人更多只是反馈更多,不是反馈更好。
- beta 要跑多久? 多数独立 App 跑 1-3 周。少于一周抓不出不明显的 bug;超过一个月测试者动力会掉。
- TestFlight 要花钱吗? 不要。它包含在 Apple Developer Program 里(2026 年 6 月为每年 $99),没有按测试者收费。
- TestFlight build 会和 App Store 版本冲突吗? 不会。TestFlight 装的版本和 App Store 版本并存,图标角标略有不同,不会互相覆盖。
- Beta App Review 要多久? 一般不到 24 小时,常见几小时,而且只针对外部组每个版本的第一个 build。Apple 不给 SLA,所以计划外部推送前最好预留一天。
- 测试者能在 App Store 留评论吗? TestFlight build 里不行。要等上线后他们装 App Store 版本再去那边评论。