跳到主要内容
教程目录

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 的「用户和访问」里邀请同事,对方接受邀请后才算团队成员。不是团队成员的人加不进内部测试组,只能走外部测试。

建内部测试组

  1. 在 App Store Connect 的「App」里选中你的 App,打开 TestFlight 标签页。
  2. 在左侧栏「内部测试」旁边点「+」,输入组名,例如「开发自测」,点「创建」。
  3. 在组里添加测试员,从团队成员中勾选。
  4. 在组的「构建版本」里添加刚处理完的构建。

创建组时可以勾选自动分发,以后新的构建会自动发给组里所有人,不用每次手动添加。没开的话,每个新构建都要手动加进组。

操作需要账户持有人、管理、App 管理、开发者或营销角色,步骤以 Apple 的添加内部测试员为准。

怎么邀请外部测试员?

外部测试员可以是任何人,用邮箱邀请或者发公开链接,每个 App 最多 10000 人。适合给客户、种子用户、运营同事试用。

先填测试信息

在 TestFlight 页左侧「其他」下打开「测试信息」,选择语言,填写下面两项。

  • Beta 版 App 描述,必填,告诉测试员这个 App 是做什么的。
  • 反馈电子邮件,测试员在 TestFlight 里联系你用的邮箱,也是邀请邮件的回复地址。

App 需要登录才能用的,在 Beta 审核信息里准备一个测试账号,和正式提审一样,审核员登录不进去会被退回。

建外部测试组并提交 Beta 审核

  1. 必须先有一个内部测试组,才能建外部测试组。
  2. 在左侧栏「外部测试」旁边点「+」,输入组名,点「创建」。
  3. 选中这个组,点「添加构建版本」,选择版本和构建,在「测试内容」里写清这次要测什么,测试员会在 TestFlight 里看到。
  4. 点「提交审核」。

每个版本的第一个构建要先经过 TestFlight 的 Beta 审核,通过后才能测试,同一版本后续的构建不一定需要完整审核。同一时间每个版本只能有一个构建在审核,24 小时内最多提交 6 个构建。被拒时构建状态显示为被拒绝,在左侧「App 审核」里看原因,改好后加构建号重新上传。

邀请测试员

两种方式可以同时用。

  • 邮箱邀请。选中组,点「测试员」旁边的「+」,逐个输入邮箱,或者导入 CSV。测试员收到邮件后在 TestFlight 里接受。
  • 公开链接。在组的「测试员」标签下点「创建公开链接」,选择对任何人开放,或者按设备和系统版本设置条件,还可以设置人数上限(1 到 10000)。复制链接发到群里、贴在官网上都行。

公开链接任何拿到的人都能转发,通过链接加入的测试员在列表里显示为匿名。不想再收新测试员时,在「公开链接」旁的「管理」里关闭它。外部测试的完整步骤见 Apple 的邀请外部测试员。

内部测试和外部测试怎么选?

对比项 内部测试 外部测试
人数上限 100 人 10000 人
谁能参加 App Store Connect 团队成员 任何人
邀请方式 从团队成员中添加 邮箱邀请、CSV 导入、公开链接
是否要审核 不需要 每个版本第一个构建要过 Beta 审核
开始测试时间 构建处理完即可 审核通过后
构建有效期 90 天 90 天
适合 开发、测试同事每天自测 客户验收、公开招募测试用户

常见的做法是两个都建。每次构建先发内部组自测,确认没有明显问题,再把同一个构建加进外部组。

测试员怎么安装测试版?

把下面这几步发给测试员。

  1. 在 iPhone 上打开 App Store,搜索并安装免费的 TestFlight App。
  2. 用收到的邀请邮件或公开链接打开邀请,在 TestFlight 里点「接受」。
  3. 点「安装」,App 出现在桌面上。
  4. 有新构建时 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 证书重新构建。