Apple 已审核 2025 年共有 9,100,620 次 App 提交,其中 2,093,244 次被拒绝,其中 387,087 次被拒后通过审核,根据 Apple App Store 透明度数据。这大约相当于 最初有 23% 被拒绝,因此 iOS App 提交并非只是一个形式上的上传步骤。它是一个高标准的发布流程,需要确保签名、二进制行为、元数据、商店政策以及审核员访问权限等环节环环相扣。
Apple 还表示 90% 的提交会在 24 小时内完成审核 在其 App Review 页面上。快速审核固然有用,但并不意味着审核会自动通过。在实践中,那些能够从容发布产品的团队会将提交视为一种 具备抗拒绝能力的系统:他们会确保 Native Build 稳定,准备易于审核的版本,谨慎地分阶段发布变更,并保留一条修复 Web 层问题的安全路径,从而避免将每一个紧急的文案或样式 Bug 都变成一次新的商店提交。
目录
- iOS App 提交的真实内幕
- 避免签名失败的先决条件
- 构建并签名用于发布的 Capacitor App
- 通过 TestFlight 进行测试并完善 App Store 元数据
- 应对 App 审核并避免常见的拒绝情况
- 最终检查:无需重新提交即可发布更新
iOS App 提交的真实流程解析
考虑一个典型的失败场景:团队在周五深夜完成了 Capacitor App,在 Xcode 中归档并上传了 Build,以为最难的部分已经结束。但在审核期间,Apple 发现登录账号失效、后端接口无法访问,或者元数据中描述的功能无法使用。拒绝通知可能很快就会到来,但修复过程仍需要新的 Build、重新上传、再次进入审核周期,以及一个完全没有预留缓冲时间的发布计划。
将提交视为一个 具备抗拒绝能力的系统, 而非仅仅是一份上传清单。完整的流程在 Xcode 之前就开始了:
- 加入 Apple Developer Program 并确认负责签名和 App Store Connect 的人员拥有正确的权限。
- 创建并配置 App Identity,包括 Bundle ID、Capabilities、证书及 Provisioning 设置。
- 在 App Store Connect 中创建 App 记录 ,并使用匹配的 Bundle Identifier。
- 构建并签名 Release Archive ,可通过 Xcode 或受控的 CI 工作流完成。
- 上传 Binary,随后使用 TestFlight 测试即将发布的正式构建版本。
- 填写元数据与审核信息,提交版本并根据 Apple 的反馈进行响应。

Apple 评估的三个层面
该包由三个关联层组成。
该 二进制层 包含编译后的应用、签名、entitlements、原生插件、隐私声明及运行时行为。 元数据层 包含截图、描述、关键词、URL、分级问卷、隐私信息及 App Review 信息。 策略层 涵盖应用行为、销售内容、用户数据处理方式,以及商店实现是否符合 Apple 规则。
Capacitor 应用会增加特定的复杂性。虽然 JavaScript 和 CSS 可以跨平台,但 iOS 外壳仍包含 Xcode target、原生依赖、entitlements、签名设置及嵌入的 Web 资源集。对插件、URL scheme、推送通知能力或原生配置的任何改动,都可能将常规的 Web 发布转变为必须经过审核的原生发布。
实用原则: 请将每次提交都视为可复现的发布产物,而非开发者笔记本上的最新文件夹。
Apple 的审核队列也会影响发布计划。Apple 最多允许 同一平台同时有两个提交正在审核,一个是 App 版本,另一个是诸如 App 内活动之类的项目,具体取决于其 提交指南,将发布关键变更合并到同一个队列位置会带来本可避免的风险。先准备好 App 版本,提交前填写完整 App Review Information,并尽可能将原生变更与 Web 层修复分开处理。
只要不改变原生能力或违反 Apple 规则,Web 层修复通常可以通过受控的 Live Updates 发布。原生变更仍需进入常规审核队列。团队可以记录所有权归属、状态检查和响应流程,并借助 App Store 审核管理,这样被拒时能进行受控修复,而不是紧急重新构建。
防止签名失败的前置条件
签名失败通常源于配置漂移。例如 App Store Connect 中的 Bundle ID 与 Xcode target 不一致、项目中存在某个 Capability 但 Developer portal 中没有,或者 CI 机器上的证书缺少为其授权的 provisioning profile。在 Archive 失败后再修复,比在开发进入发布周之前验证要慢得多。
建立账号与所有权模型
确认 Apple Developer 账号处于活跃状态,并确保负责发布的人员拥有 Developer portal 和 App Store Connect 的访问权限。团队通常会进行职责分离,因此管理证书的人可能并不是提交元数据的人。请记录下每个环节的负责人,特别是涉及代理商、承包商或初创公司创始人时。
在上传之前,先创建 App Store Connect 应用记录 。请选择正确的平台、主要语言、应用名称、bundle ID 和 SKU。bundle ID 必须与 Xcode target 中使用的标识符完全一致。如果使用错误的标识符创建了记录,后续无法通过修改文件名来修复。
验证标识符与 Capabilities
在 Apple Developer portal 中检查与应用关联的 App ID。仅启用产品所需的 capabilities,例如 push notifications、associated domains、Sign in with Apple 或 keychain sharing。然后将这些设置与 Xcode 中的 签名与能力 (Signing & Capabilities) 选项卡进行对比。
对于 Capacitor,请检查 capacitor.config 或 capacitor.config.ts中的标识符、iOS 项目 target 以及应用记录。如果你更改了 app ID,请运行相应的 Capacitor 同步命令并检查原生项目,不要假设生成的配置会自动更新到每个 target。
当团队希望由 Xcode 管理常规证书和 Profile 关系时,请使用自动签名 (Automatic signing)。对于受严格控制的 CI、多 Target 或对凭据所有权有严格要求的组织,手动签名可能更合适,但它会产生更多需要保持一致的对象。
运行发布前检查
在归档 (Archive) 之前,请确认:
- 账号访问权限: 所选的 Apple 团队是目标组织,而非个人或旧有的团队。
- Bundle Identity: Xcode Target、Capacitor 配置、App ID 以及 App Store Connect 中的记录均使用相同的标识符。
- Capabilities: Entitlements 与 App ID 已启用的服务保持一致。
- 发布签名 (Distribution signing): 所选的发布身份 (Distribution identity) 有效且构建环境可访问。
- Provisioning: 配置文件需与正确的 App ID、证书及分发方式相匹配。
- Targets: Extensions、通知服务及其他 bundled targets 均使用兼容的签名设置。
- Secrets: CI 已配置所需的证书和配置文件,且未将其暴露在代码仓库中。
开发版 build 成功仅证明团队可以运行 App,并不代表可以进行分发。
对于管理多个 App 或环境的团队,证书所有权需要一套专门的流程。请记录过期时间、负责人、续期步骤以及配置文件的安装位置。 Capacitor 证书管理 是构建该工作流的有效参考,从而避免依赖单个开发者的本地环境。
为发布构建并签名您的 Capacitor App
Release archive 应包含您打算发布的 Web 资源。在 Capacitor 项目中,这意味着先构建前端、同步原生项目、检查 iOS target,最后才创建 archive。如果对旧的 www 目录进行 archiving,可能会生成一个签名完全有效但界面陈旧、缺失修复或配置不匹配的 App。

Xcode 前的项目准备工作
可靠的操作流程如下:
- 使用生产环境配置构建 Web 应用。
- 运行
npx cap sync ios以确保原生依赖与 Web 资源保持一致。 - 在 Xcode 中打开 workspace,而不是过时的项目文件。
- 选择目标 App Scheme 和通用的 iOS Distribution 目标设备。
- 确认营销版本号 (Marketing Version) 和构建版本号 (Build Number)。
- 检查 App 及每个 Extension Target 的 Signing & Capabilities 设置。
- 运行 Release Build 或进行 Archive。
App Store Connect 中显示的版本必须与 Xcode Target 中配置的版本一致。每个版本对应的上传产物,其 Build Number 必须递增。建议将这些值纳入版本控制或在 CI 中自动生成,因为手动修改多个 Target 的版本号极易导致上传错误的产物。
如果 Xcode 提示找不到 provisioning profile,请先确认 Team 和 Bundle ID 是否正确。如果提示签名证书无效,请检查执行 archive 操作的机器上的 keychain。如果 entitlement 被拒绝,请对比该 .entitlements 文件与 App ID 中已启用的 capabilities 是否一致。不要通过随意切换签名选项来解决这些错误,务必找到不匹配的地方。
归档并检查构建产物
在 Xcode 中,选择 产品,然后 Archive。处理完成后,打开 Organizer 并选择 分发 App,随后按照 TestFlight 和 App Store 的分发路径进行操作。Xcode 会在 upload 前验证 archive,但验证并不能替代对已安装构建版本的实际测试。
通过 TestFlight 安装上传的构建版本,并测试 Apple 可能重点审查的流程:
- 首次启动与 onboarding
- 账号创建与登录
- 密码重置或 Magic Link 访问
- 购买记录与订阅恢复
- 相机、麦克风、位置及通知权限
- Deep Links 与外部身份验证
- 离线行为及请求失败后的恢复机制
- 截图或元数据中描述的所有功能
Capacitor 应用可能在编译时通过但在运行时失败,因为生产环境的后端 URL、Web 资源路径、原生权限字符串或插件配置与开发环境不一致。请在干净的设备或模拟器状态下进行测试,并使用准备提交给 App Review 的准确账号信息进行测试。
缺乏可靠 Mac 发布环境的团队可以使用托管构建基础设施或 CI。 通过 GitHub Actions 实现 Capacitor iOS 构建自动化 可以帮助规范 Archive 创建、签名及构建产物处理。对于希望内部化该流程的企业, 初创公司 iOS 开发人员招聘 旨在帮助你寻找不仅能做前端开发,还能处理 Swift、Xcode、签名及发布流程的工程师。
下方的视频可以作为 Xcode 工作流部分的直观演示。
在 upload 之前,请检查 archive 的 identity、version、build number、包含的 architectures、entitlements 以及 embedded assets。确保 archive 与其对应的 commit、web build、环境配置和 release notes 保持关联。当审核提出疑问时,这种可追溯性能让你给出精准的答复。
使用 TestFlight 进行上传并完善 App Store 元数据
上传 binary 只是启动了一个受控的发布流程,并不代表提交完成。你可以使用 Xcode Organizer 将 archive 发送到 App Store Connect,或者使用更倾向于独立交付工具的 Transporter。App Store Connect 会先处理 upload,之后 build 才会出现在 TestFlight 中或可用于版本选择。请务必在发布窗口临近时,提前解决处理延迟和验证警告问题。

使用 TestFlight 作为发布闸口
通过 TestFlight 安装构建好的版本。直接在本地使用 Xcode 启动可能会忽略分发环境特有的行为、entitlements 以及配置差异。内部测试人员可以快速验证核心流程;外部测试人员则有助于发现 App Store Connect 团队之外的用户可能遇到的问题。建议按目的划分测试组:产品组用于验证功能表现,而发布组则负责检查升级、身份验证、权限以及易崩溃的路径。
Beta 版说明应注明变更内容以及测试人员的关注重点。利用相同的证据来准备 App 审核信息。如果需要登录,请提供可用的演示账号,说明设置步骤,并指出在首屏无法直观看到的各项功能。
将产品页面作为一个整体进行完善
Metadata 是对二进制文件的承诺。
准备好应用名称、适用情况下的副标题、描述、关键词、截图、分类、年龄分级回答、隐私详情、支持 URL 以及营销 URL。在开发网络之外测试每一个 URL。内部 VPN 要求、证书错误或在干净设备上登录失败,都可能削弱原本稳定的提交质量。
截图应与当前界面及可用功能保持一致。移除占位符文本、调试标签、未完成的空状态以及特定环境的内容。针对多个商店或语言,请检查每个本地化版本,而不要假设翻译后的字符串就足够了。该 面向开发者的 App Store metadata 指南 提供了实用的字段清单,但填完字段本身并不能说明产品流程。审核人员仍需能体验到产品页所展示的价值。
有策略地分阶段提交
将版本提交和推广项目作为独立的发布决策来处理。当 App 修复决定可用性时,先提交对发布至关重要的版本。如果 In-App Event 与该版本绑定,请随发布计划一并准备其素材和日期,并且只有当活动能在已审核的 build 上正常运行时才提交。这样可避免某个营销项目成为版本包等待的原因,同时让相关上线工作保持可追溯。
App Store Connect 处理完 build 后,在版本中选择该 build,回答出口合规和内容权利问题,附上审核备注并提交。记录提交的 build 号和准确的元数据快照。如果 Apple 询问审核人员遇到的是哪个流程、账号或后端版本,这些记录有助于准确回答。
对于 Capacitor 团队,建议将 Web 层修复与 Native 发布变更分开处理。通过受控的 live update,可以在无需通过 Native 审核队列的情况下,修复符合条件的 JavaScript 或资源缺陷。而 Native code、权限、插件和配置仍需遵循常规的构建与审核流程。这种分离让提交过程变成了一个具备“抗拒拒绝”能力的系统:先彻底测试已审核的二进制文件,将紧急的重新提交留给那些必须经过 Native 审批的变更。
应对 App Review 并避免常见的拒绝情况
拒绝数据指向了一个务实的结论:团队不应把时间花在猜测审核员模糊的偏好上,而应更多地证明 App 是完整、功能完备且易于使用的。Apple 2025 年的分析记录了 1,354,418 起与性能相关的拒绝案例,并且 Apple 的 App 审核指南 要求最终版本必须包含完整的元数据、可用的 URL、在线的后端服务、必要的演示访问权限,以及针对非直观功能的详细说明。
提升提交 Build 的韧性
审核员在查看 App 时可能并不了解你们团队的背景。如果首屏需要账号,请提供可用的凭据。如果订阅功能隐藏在特定的导航路径下,请予以说明。如果硬件功能需要设置,请解释操作步骤。如果后端有维护窗口,请避开维护期,选择核心流程可用的时间段进行提交。
性能问题尤其危险,因为它们可能只在真实环境下才会出现。请测试冷启动、弱网、请求中断、大数据量账户、权限拒绝以及从后台返回等场景。Capacitor 外壳内的 Web 层错误在审核员看来可能像是原生应用缺陷,因此请务必同时捕获前端错误和原生崩溃报告。
将应用商店规则视为发布输入
Apple 2025 年的变更影响了美国应用商店,并修改了涉及按钮、外部链接以及替代购买方式引导语的相关规则。Apple 在关于这些准则变更的公告中,将受影响的领域标识为 Guidelines 3.1.1, 3.1.1(a), 3.1.3, 和 3.1.3(a) 在公告中进行了说明。一个符合某个应用商店假设的变现流程,在其他地区可能需要不同的处理方式。
这并不意味着你应该向审核隐藏购买路径。它的意思是,在提交之前,你应该梳理好目标应用商店、支付流程、按钮、链接以及说明文案。审核员看到的行为应当与你的政策分析预期一致。
| 拒绝原因 | 预防措施 | 需要重新提交 |
|---|---|---|
| 应用流程不完整 | 移除占位符,完成 onboarding,并测试每一项宣传的功能 | 通常情况下,如果二进制文件的行为不完整 |
| 登录失效或后端无法访问 | 提供可用的 Demo 权限,并在审核期间保持生产环境服务在线 | 是的,当故障发生在二进制文件或服务契约内部时 |
| 性能与稳定性问题 | 测试冷启动、网络中断、权限请求及长流程任务 | 通常需要,特别是涉及原生或捆绑的 code 变更时 |
| 非显性功能 | 在 App Review 备注中添加包含精确操作步骤的简明说明 | 不一定,如果问题仅是缺少上下文且 Build 已能正常运行 |
| URL 失效或元数据不完整 | 在干净的环境中验证隐私政策、支持、营销及功能链接 | 是的,如果 URL 已嵌入 App 内或元数据无法独立修复 |
| 内购与外部链接策略不一致 | 对照当前指南章节检查商店特定的实现方式 | 通常在按钮、链接或原生购买行为需要变更时 |
将原生修复与 Web 层修复分离
对于 Capacitor 团队,一套具备抗拒拒绝能力的系统应在重新构建前对修复方案进行分类。涉及 Swift code、插件、entitlements、权限、原生配置、嵌入式 SDK 或应用核心行为的变更,应进入常规 App Store 审核队列。而 JavaScript、CSS、文案及 Web 资源,只要更新符合 Apple 规则且不改变已审核产品的本质功能,有时可以通过受控的 Live Update 机制进行交付。
Capgo 是向特定 Channel 交付签名 Web bundle 的一种方案,支持分阶段发布和回滚控制。这可以在原生变更仍遵循常规审核流程的同时,减少因标签错误、布局问题或 Web 层防护失效而导致的紧急重新提交。它并非规避政策合规性的手段。提交的原生壳程序及其声明的功能仍需保持完整并可供审核。
最终检查:无需重新提交即可发布更新
可靠的发布闭环始于验证,而非乐观。在提交之前,请确认 版本号与构建号,包括分发签名、entitlements、已处理的 TestFlight 安装、真机冒烟测试、元数据、隐私与支持 URL、审核员凭据、购买流程以及后端可用性。请将 commit、归档、配置和审核备注一并保存。
通过审核后,请密切关注崩溃报告、前端错误、登录失败和支持工单。若被拒绝,请仔细阅读 Resolution Center 的消息,复现确切问题,并提供具体的导航步骤进行回复或提交修复后的 build。如果认为拒绝结果有误,请通过 Apple 的沟通和申诉渠道解决,切勿盲目尝试未经验证的规避方案。
使用 Live Update 工作流可以缩短符合条件的 Web 层修复路径。 使用 Capgo 实现符合 App Store 安全标准的 OTA 更新 描述了其运行模式:将签名后的 bundle 发布到受控 channel,向选定受众逐步推送,监控采用率和失败情况,并保留回滚保护。保持生产环境发布范围较窄,通过 staging channel 测试更新;一旦变更影响到已审核的原生层,则必须进行 Native Build 提交。
可持续的发布节奏非常简单: 审慎提交原生变更,测试每一个承诺的流程,并通过受控的发布系统交付符合条件的 Web 层改进。这能让 iOS App 提交从一次重复的“救火行动”转变为团队可以掌控的标准化发布流程。
Capgo 助力 Capacitor 团队通过定向渠道交付已签名的 JavaScript、CSS、文案、配置及资源更新,并提供发布监控与回滚保护,同时原生变更仍通过 App Review 进行。 Capgo 了解如何为您的 iOS 发布工作流添加这种具备抗拒审核风险的更新路径。