TestFlight 内测教程:在 Windows 上传构建、添加 TestFlight 测试员
最后更新
TestFlight 内测是 Apple 官方的测试版分发方式,测试员在 iPhone 上装 TestFlight App 就能安装你的测试版,不用登记 UDID。整个流程是:用 App Store 描述文件构建 Release ipa,上传到 App Store Connect,处理完成后答好出口合规,再把构建分给内部测试员(最多 100 人,不用审核)或外部测试员(最多 10000 人,第一个构建要过 Beta 审核)。下文在 Windows 上按这个顺序走一遍。
开始前你需要准备好这几样东西。
- 已加入 Apple Developer Program 的账号,App Store Connect 里已经建好这个 App 的记录。还没做的先看在 Windows 上上架 App Store的前三节。
- Apple Distribution 证书(.p12)和 App Store 类型的描述文件(.mobileprovision),放在工程根目录的
keychain文件夹里。获取方法见证书与签名。 - 一个能用 KXBuild 正常构建的工程。
TestFlight 内测的整体流程是什么?
| 步骤 | 在哪里做 | 要等多久 |
|---|---|---|
| 1. 构建 Release ipa | VS Code 或命令行 | 几分钟 |
| 2. 上传 ipa | Appuploader(Windows)或 Transporter(Mac) | 几分钟 |
| 3. 构建处理 | Apple 自动完成 | 几分钟到几十分钟 |
| 4. 出口合规 | App Store Connect 的 TestFlight 页,或提前写进 Info.plist | 立即 |
| 5. 内部测试 | TestFlight 页的 Internal Testing | 处理完即可安装 |
| 6. 外部测试 | TestFlight 页的 External Testing | 第一个构建要等 Beta 审核 |
| 7. 收集反馈 | TestFlight 的反馈页和 kxdevice | 测试期间 |
怎么构建 TestFlight 用的 Release ipa?
TestFlight 只接受用 App Store 描述文件签名的包。Ad Hoc 或 Development 描述文件签的包能传上去,但测试员装不上。
改构建号
同一个版本号下,每次上传的构建号(CFBundleVersion)都要比上一次大。在工程设置编辑器的 General 页把构建号加一,或者构建时用 -D 临时覆盖,不改工程文件。
1kxbuild build .\MyApp.xcodeproj -c Release --export app-store -D CURRENT_PROJECT_VERSION=12
-D 覆盖的前提是 Info.plist 的 CFBundleVersion 写成 $(CURRENT_PROJECT_VERSION),Xcode 13 之后新建的工程默认如此。在 CI 里自动生成构建号的写法见自动递增构建号。
构建
以下两种做法任选其一。
- VS Code 插件。在命令面板或工程的右键菜单运行
KXBuild: 生成 App Store ipa。 - 命令行。在工程目录执行下面这条,用了 CocoaPods 的工程把 .xcodeproj 换成 .xcworkspace。
1kxbuild build .\MyApp.xcodeproj -c Release --export app-store
完成后工程目录下生成 build\MyApp.ipa。--export app-store 不管工程里设的是哪种证书,都用证书目录里的 Apple Distribution 证书和 App Store 描述文件签名。提示找不到 App Store 描述文件时,把 App Store 类型的 .mobileprovision 放进证书目录,Distribution 证书的 .p12 也放进去,密码写在 password.properties 里。
证书目录里同一个 Bundle ID 同时有 Ad Hoc 和 App Store 两份描述文件时,两份都留着即可,--export app-store 只用 App Store 描述文件,不用另外指定。同时出两种包的做法见 iOS 多环境打包的「构建时怎么选」一节。
怎么把 ipa 上传到 App Store Connect?
Windows 上用 Appuploader 上传。打开后用开发者账号登录,在上传页选中 build\MyApp.ipa,等进度走完。手边有 Mac 的,也可以用 Apple 的 Transporter,把 ipa 拖进去即可。完整说明见发布与上架。
上传时 Apple 会检查签名、描述文件、图标和 Info.plist,不合格的包直接报错并写明原因。最常见的三种如下。
| 报错内容 | 原因 | 处理 |
|---|---|---|
| 构建号已经用过 | CFBundleVersion 不比上一次大 | 构建号加一后重新构建 |
| 描述文件类型不对 | 用了 Ad Hoc 或 Development 描述文件 | 换成 App Store 描述文件 |
| 缺少图标 | AppIcon 缺 1024×1024 的图 | 在资源目录编辑器里补上 |
要在流水线里自动上传,用 App Store Connect API 密钥加命令行版 Transporter,见用 API 密钥自动上传 ipa。
上传后为什么还要答出口合规?
上传成功后 Apple 还要处理一段时间,通常几分钟到几十分钟,处理完会发邮件。打开 App Store Connect,进入这个 App 的 TestFlight 页,构建出现在 iOS 构建列表里。
回答出口合规问题
构建旁边显示「缺少合规证明」(Missing Compliance)时,测试员还装不了。点构建旁边的「管理」,回答加密相关的问题。App 只用了 HTTPS 和系统自带的加密功能的,按实际情况选择不使用非豁免加密。用了自己实现的加密算法,或者不确定是否属于豁免范围的,按 Apple 的出口合规说明判断,必要时提交合规文件。
写进 Info.plist,以后不用每次回答
每个构建都答一遍很麻烦。确认 App 不使用非豁免加密后,在 Info.plist 里加一个 Boolean 类型的 ITSAppUsesNonExemptEncryption,值为 NO,之后上传的构建就不会再问。键的定义见 Apple 的 ITSAppUsesNonExemptEncryption 文档。
工程有 Info.plist 文件的,用属性列表编辑器打开它,在根字典上右键「添加行」,键名填 ITSAppUsesNonExemptEncryption,类型选 Boolean,值设为 NO,Ctrl+S 保存。保存后的 XML 是这样的。
1<key>ITSAppUsesNonExemptEncryption</key>
2<false/>
Xcode 13 之后新建的工程通常没有 Info.plist 文件。新建一个 Config\Info.plist,只写这一个键,再把 target 的 Info.plist 文件指向它,构建时会和自动生成的内容合并。
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3<plist version="1.0">
4<dict>
5 <key>ITSAppUsesNonExemptEncryption</key>
6 <false/>
7</dict>
8</plist>
1kxbuild project add-setting -k INFOPLIST_FILE -v Config/Info.plist -t MyApp -P .\MyApp.xcodeproj
这个值只能如实填写。App 实际用了非豁免加密却写 NO,责任在你,Apple 可能要求补充材料。
怎么添加内部 TestFlight 测试员?
内部测试员必须是你 App Store Connect 团队里的成员,每个 App 最多 100 人。构建处理完、合规答完就能装,不用审核,适合开发和测试同事自测。
先把测试员加进团队
在 App Store Connect 的「用户和访问」里邀请同事,对方接受邀请后才算团队成员。不是团队成员的人加不进内部测试组,只能走外部测试。
建内部测试组
- 在 App Store Connect 的「App」里选中你的 App,打开 TestFlight 标签页。
- 在左侧栏「内部测试」旁边点「+」,输入组名,例如「开发自测」,点「创建」。
- 在组里添加测试员,从团队成员中勾选。
- 在组的「构建版本」里添加刚处理完的构建。
创建组时可以勾选自动分发,以后新的构建会自动发给组里所有人,不用每次手动添加。没开的话,每个新构建都要手动加进组。
操作需要账户持有人、管理、App 管理、开发者或营销角色,步骤以 Apple 的添加内部测试员为准。
怎么邀请外部测试员?
外部测试员可以是任何人,用邮箱邀请或者发公开链接,每个 App 最多 10000 人。适合给客户、种子用户、运营同事试用。
先填测试信息
在 TestFlight 页左侧「其他」下打开「测试信息」,选择语言,填写下面两项。
- Beta 版 App 描述,必填,告诉测试员这个 App 是做什么的。
- 反馈电子邮件,测试员在 TestFlight 里联系你用的邮箱,也是邀请邮件的回复地址。
App 需要登录才能用的,在 Beta 审核信息里准备一个测试账号,和正式提审一样,审核员登录不进去会被退回。
建外部测试组并提交 Beta 审核
- 必须先有一个内部测试组,才能建外部测试组。
- 在左侧栏「外部测试」旁边点「+」,输入组名,点「创建」。
- 选中这个组,点「添加构建版本」,选择版本和构建,在「测试内容」里写清这次要测什么,测试员会在 TestFlight 里看到。
- 点「提交审核」。
每个版本的第一个构建要先经过 TestFlight 的 Beta 审核,通过后才能测试,同一版本后续的构建不一定需要完整审核。同一时间每个版本只能有一个构建在审核,24 小时内最多提交 6 个构建。被拒时构建状态显示为被拒绝,在左侧「App 审核」里看原因,改好后加构建号重新上传。
邀请测试员
两种方式可以同时用。
- 邮箱邀请。选中组,点「测试员」旁边的「+」,逐个输入邮箱,或者导入 CSV。测试员收到邮件后在 TestFlight 里接受。
- 公开链接。在组的「测试员」标签下点「创建公开链接」,选择对任何人开放,或者按设备和系统版本设置条件,还可以设置人数上限(1 到 10000)。复制链接发到群里、贴在官网上都行。
公开链接任何拿到的人都能转发,通过链接加入的测试员在列表里显示为匿名。不想再收新测试员时,在「公开链接」旁的「管理」里关闭它。外部测试的完整步骤见 Apple 的邀请外部测试员。
内部测试和外部测试怎么选?
| 对比项 | 内部测试 | 外部测试 |
|---|---|---|
| 人数上限 | 100 人 | 10000 人 |
| 谁能参加 | App Store Connect 团队成员 | 任何人 |
| 邀请方式 | 从团队成员中添加 | 邮箱邀请、CSV 导入、公开链接 |
| 是否要审核 | 不需要 | 每个版本第一个构建要过 Beta 审核 |
| 开始测试时间 | 构建处理完即可 | 审核通过后 |
| 构建有效期 | 90 天 | 90 天 |
| 适合 | 开发、测试同事每天自测 | 客户验收、公开招募测试用户 |
常见的做法是两个都建。每次构建先发内部组自测,确认没有明显问题,再把同一个构建加进外部组。
测试员怎么安装测试版?
把下面这几步发给测试员。
- 在 iPhone 上打开 App Store,搜索并安装免费的 TestFlight App。
- 用收到的邀请邮件或公开链接打开邀请,在 TestFlight 里点「接受」。
- 点「安装」,App 出现在桌面上。
- 有新构建时 TestFlight 会通知,点「更新」即可。
TestFlight 安装的测试版和 App Store 正式版是同一个 Bundle ID,会互相覆盖。测试员手机上装着正式版的,安装测试版后会替换掉,测试结束后从 App Store 重新安装正式版即可。
构建 90 天后过期
每个构建从上传起最多可以测试 90 天,到期后测试员就不能再打开这个构建,见 Apple 的 TestFlight 概览。测试周期长的项目,在到期前上传一个新构建,加构建号重新构建、上传、加进测试组即可,测试员在 TestFlight 里更新就能继续用。
怎么收集测试反馈和崩溃?
测试员提交反馈
测试员在 TestFlight App 里打开你的 App 页面可以发送反馈,也可以在测试版里直接截屏,截屏后选择分享给开发者。反馈集中显示在 App Store Connect 里 TestFlight 页的「反馈」部分。系统版本较旧、发不了 App 内反馈的测试员,会把反馈发到你在测试信息里填的反馈邮箱。
看崩溃
TestFlight 页会统计每个构建的会话数和崩溃数,先看崩溃集中在哪个构建上。
测试员就在身边的,直接把手机接到电脑上导出崩溃报告,报告里有出错的函数和调用栈。
1kxdevice crash pull .\crashes MyApp*
命令用法见 kxdevice 命令参考。崩溃报告怎么看、怎么在真机上复现定位,见 Windows 上真机调试 iOS App。
TestFlight 内测通过后,在 App Store Connect 的「App Store」页选这个构建提交正式审核,后续步骤见在 Windows 上上架 App Store。
常见问题
TestFlight 最多能邀请多少测试员?
截至 2026 年 10 月,内部测试员每个 App 最多 100 人,必须是 App Store Connect 团队成员;外部测试员每个 App 最多 10000 人,任何人都可以。两种可以同时使用。
上传成功了,TestFlight 里为什么看不到构建?
构建上传后要等 Apple 处理,通常几分钟到几十分钟,处理完会发邮件。处理完后显示「缺少合规证明」的,回答出口合规问题后才能分发给测试员。
TestFlight 外部测试要审核多久?
每个版本的第一个构建要过 Beta 审核,Apple 没有承诺具体时长,通常在一天以内出结果。同一版本后续的构建不一定需要完整审核,内部测试则完全不用审核。
TestFlight 构建过期了怎么办?
每个构建最多可测试 90 天,过期后不能延长。把构建号加一,重新构建并上传,再把新构建加进测试组,测试员在 TestFlight 里更新即可继续测试。
用 Ad Hoc 包能上传 TestFlight 吗?
不能用于测试。TestFlight 要求 App Store 类型的描述文件签名,Ad Hoc 或 Development 签的包即使传上去,测试员也装不上。构建前把 App Store 描述文件放进 keychain 文件夹,用 Release 配置和 Apple Distribution 证书重新构建。