以下为 Google Gemini 整理,仅略作修改。


如果你觉得 Google Play 是“狂野西部”(规则多但自动化程度高),那么 Apple App Store 就是“皇家宫殿”——审核人工介入深、对细节要求极高、甚至有点“洁癖”

以下是基于 2025 年标准 的 iOS App Store 发布与更新实战指南。


⚠️ 第一部分:发布前必查(苹果的特殊红线)

在 iOS 上架,如果不注意以下三点,几乎 100% 会被拒审或卡住:

  1. 隐私清单 (Privacy Manifests)

    • 政策现状: 从 2024 年春季开始强制执行。你的 App 及引用的第三方 SDK(如 Firebase, Facebook SDK)必须包含隐私清单文件。
    • 后果: 如果缺失或描述不符,上传包时会直接报错,根本无法提交审核。
  2. App 完整性与“占位符”

    • Apple 极度讨厌“半成品”。
    • 绝对禁止: 按钮点了没反应、界面上出现 "Lorem Ipsum" 或 "Coming Soon" 字样、以及明显的 Beta 版标签。
    • 测试账号: 如果 App 需要登录,必须在后台填写测试账号和密码,并且确保该账号在审核期间能正常登入且数据有内容(不要给一个空荡荡的账号)。
  3. 邓白氏编码 (D-U-N-S Number)

    • 如果你是注册公司账号($99/年),必须拥有 D-U-N-S 编码,且公司名称必须与 Apple 开发者账号名称完全一致(连标点符号都要一样)。

🍎 第二部分:从 0 到 1 创建并发布 App

iOS 的发布流程主要围绕 App Store Connect (ASC) 进行。

1. 账号与证书准备

  • 注册: Apple Developer Program
  • 费用: $99 美元/年(需每年续费,否则 App 会下架)。
  • 证书 (Certificates) & 描述文件 (Profiles):
    • 这是 iOS 开发最繁琐的部分。通常由开发人员在 Xcode 中配置好“Distribution Certificate”和“Provisioning Profile”。
    • 运维须知: 确保打包时使用的是 Distribution (发布) 证书,而不是 Development (开发) 证书。

2. 在 App Store Connect 创建应用

  1. 登录 App Store Connect
  2. 点击 "我的 App" (My Apps) -> "+" -> "新建 App"
  3. 填写关键信息:
    • 名称: App Store 显示的名字(30 字符以内)。
    • Bundle ID (套装 ID): 必须与工程代码里的 Bundle ID 严格一致(格式如 com.company.appname)。
    • SKU: 内部使用的唯一标识符(随便填,如 app_v1_ios)。

3. 填写元数据 (Metadata) —— 细节决定成败

  • 关键字 (Keywords): 非常重要! 100 个字符限制。用户搜索主要靠它。用逗号分隔,不要加空格(如:购物,电商,买菜,特价)。
  • 技术支持网址 (Support URL): 必须有一个能联系到你的网页。
  • 屏幕截图 (Screenshots): 苹果最严格的地方。
    • 必须提供 6.5 英寸 (iPhone 15 Pro Max 尺寸) 和 5.5 英寸 (iPhone 8 Plus 尺寸) 两套图。
    • 注意:截图里不能显示安卓手机的外观,也不能出现非苹果设备的文案,否则秒拒。
  • App 隐私 (App Privacy): 类似于 Google 的 Data Safety,需要填写一份问卷,披露你收集了哪些数据(联系人、位置等)。

4. 上传构建版本 (Build)

  • 工具: 开发人员通常使用 XcodeTransporter (Apple 官方上传工具) 上传 .ipa 文件。
  • 处理时间: 上传后,后台会显示 "Processing"(正在处理)。通常需要 10-30 分钟。处理完后,你需要在 Build 栏目里手动选择这个版本。
  • 出口合规信息: 首次选择构建版本时,会问你是否涉及加密。通常选 "是" -> "是" -> "是"(如果是标准 HTTPS 加密),或者根据实际情况填写。

5. 提交审核 (Submit for Review)

  • 点击右上角的 "Add for Review"
  • 审核时间: 2025 年的标准通常是 24 - 48 小时。周末通常也审核,但速度稍慢。

🔄 第三部分:后续版本更新操作 (Routine Update)

iOS 的更新比 Google Play 直观,但更“手动”。

1. 版本号管理

  • Version (营销版本):1.2.0。这是用户在商店看到的。
  • Build (构建版本):520251122
  • 运维规则: 每次上传新包到后台,Build 号必须递增。但 Version 号只需要在发布新功能时改变。

2. 创建新版本

  1. 在 App Store Connect 首页,点击你的 App。
  2. 左侧栏上方会出现 "iOS App 1.x 准备提交"(如果没有,点 "+" 号创建新版本)。
  3. 更新版本号: 填入新的 Version(如 1.2.1)。
  4. 此版本的新增功能 (What's New): 必填。告诉用户更新了什么。

3. 选择构建版本

  • 在 "构建版本" (Build) 区域,点击 "+" 号,选择开发人员刚上传的最新包。
  • 注意:如果开发刚传完,可能要等几分钟才能刷出来。

4. 灰度发布 (Phased Release) —— 运维关键点

Apple 的灰度发布机制叫 "分阶段发布 (Phased Release for Automatic Updates)"

  • 如何开启: 在“版本发布”部分的选项里勾选 "使用分阶段发布"
  • 机制: 无法像 Google 那样自定义百分比。Apple 固定按 7 天周期放量:
    • Day 1: 1%
    • Day 2: 2%
    • Day 3: 5%
    • Day 4: 10%
    • Day 5: 20%
    • Day 6: 50%
    • Day 7: 100%
  • 作用: 如果发现重大 Bug,随时点击 "暂停分阶段发布",此时未更新的用户将不会收到推送。

5. 提交与发布方式

  • 手动发布 (Manually): 审核通过后,App 状态变为 "Pending Developer Release"。你需要上来点一下 "Release" 才会上架。(推荐运维使用,可控性强)。
  • 自动发布 (Automatically): 审核一通过,立即上架。

📝 运维专家的小抄 (Cheat Sheet)

检查项说明
TestFlight正式发布前的神器。上传包后,先推给 TestFlight 内部测试,无需审核即可安装,验证无误后再提审。
分辨率中心 (Resolution Center)如果被拒,消息会发到这里。千万不要重新提交新包来“试错”,要在里面直接回复审核人员进行申诉或解释。
加急审核 (Expedited Review)如果有导致 App 崩溃的严重 Bug,可以申请“加急”。链接比较隐蔽,且不能滥用(一年一般只有 1-2 次机会)。
元数据被拒 (Metadata Rejected)这是最好的拒审理由。说明包本身没问题,只是截图或文案有问题。改一下文案,不需要重新打包,直接回复即可过审。
4.2.3 拒审 (Minimal Functionality)很多简单套壳 App 会死在这里。Apple 认为你的 App 功能太简单,仅仅是个网页浏览器。

附录:iOS Xcode 打包

补充 Xcode 上传 这一环节非常关键。很多时候代码写好了,却因为“打包上传”这个动作卡住,导致无法按时发版。

对于运维或发布人员来说,通常有两种情况:

  1. 开发人员给源码,你需要在自己的 Mac 上编译并上传。
  2. 开发人员给 .ipa 文件,你只需要负责上传。

下面我重点讲解 场景 1:使用 Xcode 从源码直接编译并上传到 App Store Connect 的完整标准流程。


🛠️ 前置条件 (Prerequisites)

在打开 Xcode 之前,请确认:

  • Mac 设备: 必须是 macOS 系统。
  • Apple ID 权限: 你的账号在 App Store Connect 中必须有 "App Manager" (App 管理员) 或更高权限。
  • 证书配置: Xcode 的 Settings -> Accounts 中已登录开发者账号,且本地已下载好发布证书(Distribution Certificate)。

🚀 Xcode 打包上传五步走

第一步:检查版本号与构建设置

在 Xcode 左侧的文件导航栏,点击最顶部的蓝色项目图标(Project Navigator):

  1. 选择 Targets(通常是你的 App 名字)。
  2. 进入 General 选项卡。
  3. Identity 部分(核对红线):
    • Bundle Identifier: 必须和 App Store Connect 后台建的 App ID 一致。
    • Version: 比如 1.2.0(对用户展示)。
    • Build: 比如 202502(必须比上一次上传的数字大)。
  4. Signing & Capabilities: 确保 "Signing (Release)" 勾选了 "Automatically manage signing"(除非你们公司强制要求手动配置 Provisioning Profile)。

第二步:选择编译设备 (Any iOS Device)

这是新手最容易报错的地方。

  • 在 Xcode 顶部工具栏,左上角的设备选择器中。
  • 不要选模拟器(如 iPhone 15 Simulator)。
  • 必须选: "Any iOS Device (arm64)" 或者你插在电脑上的真机。
    • 如果不选真机/Any Device,"Archive" 按钮是灰色的,点不了。

第三步:执行归档 (Archive)

这是将代码编译成 App 的过程。

  1. 点击顶部菜单栏的 Product
  2. 选择 Archive
  3. 等待: 也就是所谓的“编译时间”,根据项目大小,可能需要 3 分钟到 30 分钟不等。

第四步:在 Organizer 中分发 (Distribute)

编译完成后,Xcode 会自动弹出一个叫 "Organizer" 的窗口(如果没有弹,点击 Window -> Organizer)。这里会列出所有的历史归档记录。

  1. 选中刚刚生成的那个记录(最新的一条)。
  2. 点击右侧的蓝色按钮 "Distribute App"
  3. 选择分发渠道:
    • "App Store Connect" -> Next。
    • "Upload" (上传) -> Next。(不要选 Export,Export 是导出 ipa 用的)。
  4. 配置选项 (App Store Connect options):
    • Upload your app's symbols (dSYM): 必须勾选。否则 Crashlytics 抓不到具体的崩溃代码行数。
    • Manage Version and Build Number: 建议不勾选(以你代码里写的为准)。如果勾选,Xcode 会试图自动修改你的版本号,容易乱。
  5. 签名确认 (Re-sign):
    • 选择 "Automatically manage signing" -> Next。
    • 系统会联网验证证书,如果一切正常,会显示一个包含所有信息的“Summary”页面。

第五步:上传 (Upload)

  1. 点击 "Upload" 按钮。
  2. Xcode 会开始上传二进制文件、验证 API 用法等。
  3. 成功: 出现绿色的勾,显示 "App "Name" was successfully uploaded"

💡 运维专家的“B 计划”:如果 Xcode 上传总是失败?

Xcode 上传非常依赖网络稳定性,且 UI 比较卡顿。作为运维,我强烈推荐你使用 Transporter。这是 Apple 官方推出的专门用于上传 ipa 的轻量级工具

这种方式更适合运维人员(开发给 ipa,你来传):

  1. 获取 ipa: 在上述 Xcode 流程的第四步,选择 "Export" 而不是 "Upload",导出一个 .ipa 文件。
  2. 下载 Transporter: 在 Mac App Store 免费下载。
  3. 操作:
    • 打开 Transporter,登录 Apple ID。
    • .ipa 文件直接拖进去
    • 点击 "Deliver" (交付)
  4. 优势: Transporter 的进度条更真实,网络报错信息更详细,且传输速度通常比 Xcode 快且稳。

📝 常见报错与解决 (Troubleshooting)

报错提示原因解决方法
"Redundant Binary Upload"版本号重复了。你正在上传一个后台已经存在的 Build 号。去 Xcode 改大 Build 号(如 100 改为 101)重新 Archive。
"Invalid Code Signing"证书不对。检查 Signing 设置,确保发布用的是 Distribution 证书,而不是 Developer 证书。
"Missing Info.plist key..."缺少权限描述。比如你用了相机,但没在 Info.plist 里写 NSCameraUsageDescription。根据提示补上描述即可。
ITMS-90809: Deprecated API Usage使用了过期 API。比如上传时包含 UIWebView。这是硬伤,必须让开发修改代码,移除旧 API。