要将 iOS 应用分发给测试人员,可以使用 TestFlight(内部测试人员可立即获取,外部测试人员需经过简短的 Beta App Review),或使用面向已注册设备的 ad hoc 构建。对于 Android,可以使用 Google Play 测试轨道(内部、封闭或开放测试)、通过 Play 内部应用共享生成一次性链接,或者通过 Firebase App Distribution 分享已签名的 APK,或提供直接下载。选择哪种方式取决于测试人员是谁、数量多少,以及构建是否需要走应用商店的基础设施。
本指南会对比所有选项,说明如何为 Capacitor 应用逐一配置,并列出测试人员常遇到的错误。
选择分发方式
| 方法 | 平台 | 最大测试人数 | 测试人员收到前审核 | 测试人员要求 | 最适合 |
|---|---|---|---|---|---|
| TestFlight 内部测试 | iOS | 100 名团队成员 | 否 | App Store Connect 用户、TestFlight App | 您的团队 |
| TestFlight 外部测试 | iOS | 10,000 | Beta App 审核(版本的首个构建版本) | 邮件邀请或公开链接,TestFlight App | Beta 用户、客户 |
| Ad hoc 分发 | iOS | 每种设备类型每年 100 台设备 | 否 | 已注册的 UDID,开发者模式 | 小型 QA 团队,无需 Apple 审核 |
| Play 内部测试 | Android | 100 | 无需完整审核,通常几分钟内即可使用 | 邮件列表中的 Google 账号 | 您的团队 |
| Play 封闭测试 | Android | 邮件列表或 Google Groups | 是 | Google 账号,加入测试链接 | Beta 用户,12 名测试人员要求 |
| Play 公开测试 | Android | 无限制或设上限 | 是 | 在列表页选择加入 | 公开测试版 |
| Play 内部应用分享 | Android | 任何拥有链接的人 | 否 | Google 账号,已开启设置 | 快速 QA 构建,任意版本 code |
| Firebase App Distribution | 两者都是 | 较大 | 否 | 邮件邀请;iOS 需注册 UDID | 跨平台 QA |
| 直接 APK 链接 | Android | 任何人 | 否 | 允许未知来源 | 快速内部测试 |
经验法则:
- 和上架商店的是同一个 build 吗? 使用 TestFlight 和 Play 测试轨道。测试人员用的二进制包就是最终晋级发布的包。
- 每日 QA build? 在两个商店做内部测试,或用 Firebase App Distribution。
- 需要在几分钟内测试 Web 层改动? 把 live update 发布到测试通道,而不是新的二进制包。
分发前:签名
每个测试 build 都必须签名。
- iOS 测试构建使用 App Store Connect 配置文件(TestFlight)或 Ad Hoc 分发 profile(直接安装)。两者都使用 Apple Distribution 证书。详见 iOS 证书与 provisioning profile 详解.
- Android 用于 Play 渠道的 build 是使用你的 upload key 签名的 AAB。对于直接安装,你需要一个使用任意 release key 签名的 APK。Debug APK 也可以安装,但其行为不同(可调试、签名不同),且之后无法通过你的 Play build 升级。
iOS:TestFlight
上传 build
通过 Xcode: 产品 > 归档,然后 Distribute App > App Store Connect > Upload。通过命令行或 CI,导出一个 .ipa 并使用 App Store Connect API 密钥上传,或者交给云端 build 服务来做。
自 2026 年 4 月起,上传的版本必须使用 Xcode 26 或更高版本构建。
将此密钥添加到 ios/App/App/Info.plist 如果你的 App 只使用标准 HTTPS 加密,请添加此项,这样 App Store Connect 就不会在每次 build 时都询问出口合规问题:
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
处理需要几分钟到一小时左右。build 就绪后你会收到一封邮件。
内部测试
- 在 App Store Connect 中打开你的 App, TestFlight > 内部测试,并创建一个群组。
- 添加团队成员。他们必须拥有 App Store Connect 角色(Admin、App Manager、Developer、Marketing…)。最多 100 人。
- 启用 自动分发 因此,每个新 build 都会进入该群组。
- 测试人员安装 TestFlight app(从 App Store 下载),并接受邀请。
无需审核。这是从上传到手机最快的方式。
外部测试
- TestFlight > 外部测试 > + 来创建群组。
- 通过邮箱添加测试人员,或启用 公开链接 并可选择设置测试人数上限。
- 将 build 添加到群组并填写 测试信息 (要测试的内容、反馈邮箱、Beta 版应用描述,以及需要时的演示登录信息)。
- 提交以进行 Beta 版应用审核。每个版本的第一个构建版本需要经过审核,通常在一天内完成。同一版本的后续构建版本通常无需完整审核即可发布。
外部测试最多支持 10,000 名测试人员。测试人员可以直接通过 TestFlight 发送带有反馈的截图,你可以在 App Store Connect 中查看。
需了解的 TestFlight 限制
- 构建版本过期时间 90 天.
- 测试人员使用的 iOS 版本必须在你的构建版本支持范围内(Capacitor 8 需要 iOS 15 或更高版本)。
- TestFlight 构建版本使用 App Store 生产签名,因此推送通知会使用 生产环境 APNs 环境。
- TestFlight 中的应用内购买使用 sandbox,不会实际扣费。
iOS:ad hoc 分发
Ad hoc 构建可直接安装到你在 Apple Developer 门户中注册的设备上,无需 TestFlight 或 Apple 审核。
- 收集每位测试者的 UDID。测试者可以在自己的手机上通过 iOS UDID 查询工具获取,或者在设备连接时通过 Finder 或 Xcode 读取。
- 在以下位置注册设备: Certificates, Identifiers & Profiles > Devices.
- 创建一个 Ad Hoc 分发 provisioning profile(包含这些设备)并下载。
- 构建一个
.ipa使用该描述文件 (Xcode: 分发 App > 发布测试,这是 Ad Hoc 的新名称)。 - 安装:
- 将
.ipa拖到 Finder 中的设备上,或通过 Xcode > 窗口 > 设备和模拟器. - 或者用
itms-services通过 HTTPS 提供 manifest,以便测试人员点击链接即可安装。Firebase App Distribution 等服务可以帮你完成这一步。
- 将
- 在 iOS 16 及更高版本上,从 Mac(Xcode 或 Apple Configurator)安装
.ipa需要 开发者模式 在设备上(设置 > 隐私与安全性)。通过itms-services链接安装则无需此操作。详见 如何在 iOS 上开启 Developer Mode.
添加新测试人员意味着要注册其 UDID、重新生成描述文件并重新构建。设备名额(每个设备系列 100 个)只有在会员年度续订时才会重置,所以不要随意注册设备。
Android:Google Play 测试轨道
Play Console 有三个测试轨道,外加正式版。它们都需要用您的上传密钥签名的 AAB。
内部测试
- 测试 > 内部测试 > 测试人员:创建电子邮件列表(最多 100 个地址)。
- 创建新版本,上传 AAB,添加版本说明,保存并发布。
- 复制 opt-in 链接 并将其发送给测试人员。他们接受后从 Play Store 安装。
内部版本通常几分钟内即可使用,无需等待完整审核。全新应用的首次发布可能耗时更久,因为 Google 需要处理该应用。
封闭测试
封闭测试轨道需要审核,并支持邮件列表或 Google Groups。这是你满足以下要求所需的轨道: 12 名测试人员测试 14 天 该规则适用于 2023 年 11 月 13 日之后创建的个人开发者账号,并在获得正式发布权限前生效。使用 Google Group 可以让测试人员轻松加入。详情请参阅 如何创建 Apple 和 Google Play 开发者账号.
开放测试
任何人都可以通过你的 Play 详情页加入。一旦应用商店详情页准备就绪,即可将其用于公开测试。来自公开测试人员的反馈是私密的,不会影响你的公开评分。
我们的 Android beta 测试指南 更详细地比较这些轨道。
Android:内部应用共享
内部应用共享是通过 Play Store 把任意 APK 或 AAB 装到设备上的最快方式,无需遵守版本 code 规则,也无需审核。
- 在 Play Console 中,打开 内部应用共享 (位于“测试”下)并添加上传者。
- 上传 APK 或 AAB,即可获得链接。
- 测试人员打开 Play Store 应用,进入设置,点击 Play Store 版本 连续点击七次以显示开发者选项,并开启 内部应用共享.
- 测试人员打开链接并安装。
这对 pull request 构建的 QA 很有用,因为 version code 无需递增。
Android:直接分发 APK 与 Firebase App Distribution
直接分发 APK
构建签名的 release APK。新的 Capacitor 项目没有 release 签名配置,因此 assembleRelease 会生成未签名的 APK,无法安装。请添加一个 signingConfigs.release 块(keystore 路径和密码,通常从 key.properties读取)到 android/app/build.gradle 并先指向 buildTypes.release.signingConfig 它。
bun run build
bunx cap sync android
cd android && ./gradlew assembleRelease
分享 android/app/build/outputs/apk/release/app-release.apk 通过链接安装。测试人员需允许浏览器或文件管理器安装未知应用并打开文件。如果已安装 Play Store 版本,必须先卸载,因为签名不同。你也可以通过 USB 安装,使用 adb install -r app-release.apk (参见 如何在 Android 上启用开发者选项).
从 2026 年 9 月 30 日起,巴西、印度尼西亚、新加坡和泰国的经过认证的 Android 设备将仅安装包名已由已验证开发者注册的应用,并计划于 2027 年在全球范围推广。如果你的测试人员位于这些国家,请在 Android Developer Console 或 Play Console 中注册包名。通过 adb 进行的安装不受影响。
Firebase App Distribution
Firebase App Distribution 同时支持两大平台,可以发送邮件邀请,并追踪谁安装了哪个 build。
bun add -g firebase-tools
firebase login
firebase appdistribution:distribute android/app/build/outputs/apk/release/app-release.apk \
--app 1:1234567890:android:abc123def456 \
--groups "qa-team" \
--release-notes "Fix checkout crash"
- Android 测试人员通过邮件链接或 App Tester 应用安装。
- iOS 测试人员仍需在 ad hoc(或 development)描述文件中。App Distribution 会在他们接受邀请时收集 UDID,但你仍需自行注册并重新构建。
- AAB 分发需要将 Firebase 项目关联到 Google Play。
云端构建,给测试人员一个链接
如果你不想在每台 CI runner 上维护 Mac 和签名, Capgo 构建 在云端构建 Capacitor 应用。对于测试构建,可以跳过商店提交,将二进制文件上传并生成带 QR code 的限时下载链接:
# Android APK/AAB for testers, no Play upload
bunx @capgo/cli@latest build request com.example.app \
--platform android --no-playstore-upload --output-upload --output-retention 2d
# iOS ad hoc build (no App Store submission)
bunx @capgo/cli@latest build request com.example.app \
--platform ios --ios-distribution ad_hoc --output-upload
# iOS build uploaded to TestFlight for external groups
bunx @capgo/cli@latest build request com.example.app \
--platform ios --ios-testflight-groups "Beta Testers"
添加 --output-record build.json 并在 CI 中读取该链接,使用 bunx @capgo/cli@latest build last-output --path build.json --field outputUrl 将其发布到 Pull Request 或聊天中。 Capgo 构建文档 该命令会列出所有选项。
Web 改动无需重新构建
大部分 Capacitor 应用的改动都集中在 Web 层。如果仅为了修复一段文本就重新构建并分发二进制文件,会浪费一整天的 TestFlight 处理和审核时间。使用 Capgo 实时更新,测试人员可以保留已安装的构建,而你只需向测试频道推送新的 JavaScript bundle:
bunx @capgo/cli@latest bundle upload --channel beta
你甚至可以为每个 Pull Request 分配独立的频道,让 QA 在同一个已安装的应用上切换频道。请参阅 将每个 pull request 转化为可安装的预览版.
故障排除
iOS ad hoc 上显示“无法安装”。 设备 UDID 不在描述文件中,或描述文件已过期。请检查 security cms -D -i profile.mobileprovision.
iOS 上应用打开后立即关闭。 开发者模式未开启(ad hoc/开发构建),或描述文件已过期。
TestFlight 构建卡在“处理中”。 最多等待一小时。如果失败,邮件会列出原因,通常是缺少用途描述字符串(NSCameraUsageDescription 及类似项)或图标问题。
TestFlight “缺少合规信息”。 在 App Store Connect 中回答出口合规问题,或添加 ITSAppUsesNonExemptEncryption 改为 Info.plist.
Android 提示“应用未安装”。 已安装了签名不同的版本,或者 APK 未签名或已损坏。请卸载现有应用。
测试人员选择加入后,在 Play Store 中看不到应用。 请等待几分钟,确保他们已使用受邀账号登录,并检查该版本是否已发布到对应轨道,以及他们所在的国家/地区是否可用。
上传时提示“版本 code 已被使用”。 提升 versionCode 中的 android/app/build.gradle。Internal app sharing 是例外。
TestFlight 收不到推送通知。 TestFlight 使用生产 APNs 环境。请检查 aps-environment entitlement 以及你的推送服务商的环境设置。
小团队推荐配置
- 自动分发的 TestFlight 内部测试组,以及 Play 内部测试轨道,每次合并到
main. - 面向 Beta 用户的 TestFlight 外部测试组和 Play 封闭测试轨道,每周更新。
- 在...上启用 Live Update
beta,用于在构建之间进行仅限 Web 的修复。 - 当 Beta 稳定后,将同一构建发布到两个商店的生产环境,并遵循 首次 App 审核指南.