WWDC Quick Look 💓 By SwiftGGTeam
Distribute apps in Xcode with cloud signing

Distribute apps in Xcode with cloud signing

观看原视频

Highlight

Xcode 13 把 App Store Connect 上传、应用记录创建、构建号管理和云端签名放进同一个分发流程,开发者可以在没有本机证书配置的情况下完成应用分发。

核心内容

一个应用写完以后,下一步通常才是最麻烦的部分。

你要把构建上传到 App Store Connect,才能交给 TestFlight 测试。第一次上传前,还要在 App Store Connect 创建 app record(应用记录)。本机还要准备 distribution certificate(分发证书)和 private key(私钥)。如果团队里换了一台机器,证书和私钥又会变成一次额外配置。

这场 session 用一个叫 Baker 的 iOS 应用演示完整流程。开发者已经完成第一个构建,想把它交给 TestFlight 测试员。以前这件事会跨 Xcode、本机钥匙串和 App Store Connect。Xcode 13 把这些步骤收进 Organizer 的分发向导。

第一次上传:Xcode 直接创建应用记录

Baker 第一次上传到 App Store Connect 时,还没有应用记录。Xcode 13 会在上传流程中提示创建应用记录,并从 archive(归档包)和系统设置里填入默认值,例如应用名称、bundle ID 和 primary language(主要语言)。

创建完成后,Baker 的后续构建都会进入同一个应用记录。开发者可以在那里配置 TestFlight、App Store、in-app purchases(App 内购买)和价格信息。

签名:私钥不再要求放在本机

签名用来证明应用来自可信开发者。以前使用自动签名时,机器上仍然需要分发证书和私钥。Xcode 13 引入 cloud signing(云端签名):证书和私钥可以安全地保存在云端,签名操作在云端完成。

Xcode 会从归档包里的 developer-signed app(开发者签名应用)生成 partial signature(部分签名),把应用内容的 hash 发送到服务器。服务器用私钥和证书完成签名,再把剩余签名返回给 Xcode。最终 IPA 可以上传到 App Store Connect。

后续上传:构建号可以交给 Xcode 管理

App Store Connect 用 version(版本号)和 build number(构建号)区分每一次上传。第二次上传 Baker 时,应用记录已经存在,但构建号必须有效。

Xcode 13 会检测构建号是否已经用过,或是否没有递增。如果发现问题,分发流程会提供一个有效的构建号。开发者可以在 Manage Version and Build Number 选项里看到 Xcode 选择的值。

详细内容

归档是分发的入口

02:42)Xcode 的分发从 archive 开始。archive 是一个 developer-signed release build(开发者签名的发布构建),里面包含应用和团队相关的元数据。

Run Destination: Any iOS Device
Menu: Product > Archive
Organizer: Archives > Distribute App
Distribution Method: App Store Connect
Action: Upload

关键点:

  • Any iOS Device:选择通用 iOS 设备目标,确保构建面向受支持的 iOS 设备。
  • Product > Archive:生成用于分发的发布归档包。
  • Organizer:归档完成后自动打开,显示版本、bundle ID、团队名称等信息。
  • Distribute App:启动分发向导。
  • App Store Connect:把构建发送到 App Store Connect,用于 TestFlight 或 App Store。
  • Upload:Xcode 会签名、生成 IPA,并上传到 App Store Connect。

Xcode 13 可以创建 App Store Connect 应用记录

05:20)第一次上传 Baker 时,Xcode 会检查 App Store Connect 状态,并提示创建应用记录。这个记录是后续管理 TestFlight、App Store、App 内购买和价格信息的地方。

App Record Creation
- app name: derived from archive
- bundle ID: derived from archive
- primary language: derived from system settings

Available after creation:
- TestFlight builds
- App Store builds
- in-app purchases
- pricing information

关键点:

  • app name:Xcode 从归档包推导默认应用名称。
  • bundle ID:Xcode 从归档包读取 bundle ID,用来匹配应用身份。
  • primary language:Xcode 从系统设置推导主要语言。
  • TestFlight builds:应用记录创建后,上传的构建可以进入 TestFlight 流程。
  • in-app purchases:同一个应用记录也承载 App 内购买配置。

云端签名移走本机证书配置

07:27)Xcode 13 的自动签名可以使用云端签名。证书和私钥保存在云端,Xcode 生成部分签名,服务器完成剩余签名。

Archive app
  -> generate partial signature
  -> send content hashes to Apple servers
  -> sign with cloud-managed certificate and private key
  -> return remaining signature
  -> complete distribution-signed app

关键点:

  • Archive app:输入是归档包中的开发者签名应用。
  • partial signature:Xcode 在本机生成部分签名。
  • content hashes:发送到服务器的是应用内容的 hash。
  • cloud-managed certificate and private key:服务器用云端管理的证书和私钥完成签名。
  • remaining signature:服务器返回剩余签名,Xcode 把它插入部分签名。
  • distribution-signed app:结果是可上传到 App Store Connect 的分发签名应用。

09:23)权限也有明确规则。App Store Connect 的 Admin(管理员)和 Account Holder(账户持有人)默认可以使用云端签名。Developer(开发者)角色需要被授予云端托管分发证书权限。

Cloud signing permission
- Admin: allowed by default
- Account Holder: allowed by default
- Developer: requires "Access to Cloud Managed Distribution Certificate"

关键点:

  • Admin:默认可以为 App Store Connect 分发使用云端签名。
  • Account Holder:默认可以使用云端签名。
  • Developer:需要额外授权。
  • Access to Cloud Managed Distribution Certificate:这是允许 Developer 角色使用云端签名的权限开关。

构建号管理减少重复上传失败

10:47)第二次上传 Baker 时,应用记录已经创建,流程少一步。但 App Store Connect 会用版本号和构建号区分每个构建。构建号重复或没有递增时,上传流程会受阻。

Manage Version and Build Number
- detects build number already used on App Store Connect
- detects build number not incrementing
- offers a valid build number in the archive

关键点:

  • already used:Xcode 会检查构建号是否已经上传过。
  • not incrementing:Xcode 会检查构建号是否没有递增。
  • valid build number:分发流程可以在归档包中提供一个有效构建号。
  • archive:这个修改发生在分发用的归档包里。

Mac 分发:Mac App Store 与 Developer ID

13:11)大多数 iOS 应用默认可以在 Apple silicon Mac 上运行。如果要支持 Intel Mac,可以做 Mac Catalyst 版本或原生 Mac 版本。Mac 应用有两条主要分发路径。

Mac distribution options
- Mac App Store: cloud signing, App Store Connect upload
- Developer ID: cloud signing, notarization, outside Mac App Store

关键点:

  • Mac App Store:流程与 iOS 上传类似,使用云端签名并分发到 App Store Connect。
  • same bundle ID:如果 Mac 应用和 iOS 应用使用同一个 bundle ID,会使用同一个应用记录。
  • in-app purchases:同一个应用记录意味着某些功能可以跨平台共享。
  • Developer ID:适合在 Mac App Store 外分发。
  • notarization:Developer ID 分发会上传应用做恶意内容检查,完成后 macOS 会信任该应用。

iOS 的 Ad Hoc、Custom Apps 和 Enterprise

15:13)有时开发者只想把一个修复构建直接发给队友,或把内部应用发给公司成员。Xcode 仍然保留这些分发方式。

iOS distribution options
- Ad Hoc: run on up to 100 registered devices per device type
- Custom Apps: distribute through App Store Connect
- Enterprise: distribute privately through the enterprise program

关键点:

  • Ad Hoc:用于把分发签名构建发给团队成员,设备必须注册到团队。
  • 100 registered devices per device type:Ad Hoc 的设备数量上限按设备类型计算。
  • Custom Apps:先分发到 App Store Connect,再在那里配置 custom app。
  • Enterprise:通过企业计划进行私有分发,在 Organizer 中选择 enterprise distribution method。

用 xcodebuild 自动化分发

17:18)如果团队使用持续集成服务,分发流程可以交给命令行。Xcode 的入口是 xcodebuild -exportArchive。它需要归档包、export options plist(导出选项 plist)和凭证。

xcodebuild -exportArchive \
  -archivePath "/path/to/Baker.xcarchive" \
  -exportOptionsPlist "/path/to/ExportOptions.plist" \
  -allowProvisioningUpdates \
  -authenticationKeyIssuerID "$ISSUER_ID" \
  -authenticationKeyID "$KEY_ID" \
  -authenticationKeyPath "/path/to/AuthKey.p8"

关键点:

  • xcodebuild -exportArchive:用于自动化分发的命令。
  • -archivePath:传入已经构建好的归档包路径。
  • -exportOptionsPlist:传入导出选项 plist,记录上传、bitcode、自动签名等分发选项。
  • -allowProvisioningUpdates:允许 xcodebuild 与 Apple Developer 网站通信。
  • -authenticationKeyIssuerID:传入 App Store Connect API Key 的 Issuer ID。
  • -authenticationKeyID:传入 App Store Connect API Key 的 Key ID。
  • -authenticationKeyPath:传入下载的 API Key 文件路径。

19:13)凭证有两种方式。第一种是在 Xcode 里先登录,命令行会复用一段时间内的会话。第二种是使用 App Store Connect keys,不需要在 Xcode 里登录。

xcodebuild credentials
- signed in to Xcode + -allowProvisioningUpdates
- App Store Connect keys + -allowProvisioningUpdates

关键点:

  • signed in to Xcode:适合本机自动化,登录会话会保留一段时间。
  • App Store Connect keys:适合 CI 环境,不要求图形界面登录 Xcode。
  • -allowProvisioningUpdates:两种方式都需要,因为 xcodebuild 仍要访问开发者网站。

核心启发

每周自动发 TestFlight 构建

  • 做什么:把主分支的稳定构建每周上传到 App Store Connect,交给 TestFlight 测试员。
  • 为什么值得做:session 明确给出 xcodebuild -exportArchive、export options plist 和 App Store Connect keys 这组自动化入口。
  • 怎么开始:先在 Xcode 手动导出一次 IPA,保存生成的 ExportOptions.plist;再把 xcodebuild -exportArchive 放进 CI,并用 -authenticationKeyIssuerID-authenticationKeyID-authenticationKeyPath 提供凭证。

给团队成员发临时修复包

  • 做什么:为紧急 bug fix 生成 Ad Hoc 构建,直接发给已注册设备的同事验证。
  • 为什么值得做:Ad Hoc 分发支持每类设备最多 100 台已注册设备,适合小范围验证。
  • 怎么开始:在 Organizer 的 Distribute App 中选择 Ad Hoc,导出 IPA,把构建发给设备已经注册到团队的测试成员。

把 Mac 应用放到 App Store 外分发

  • 做什么:为 Mac 工具类应用提供官网下载安装包。
  • 为什么值得做:Developer ID 分发会进行云端签名和 notarization,完成后 macOS 会信任应用运行。
  • 怎么开始:在 Xcode Organizer 中选择 Developer ID 分发方式,完成签名和公证;需要更深入的公证细节时,继续看 “Faster and simpler notarization for Mac apps”。

让非管理员开发者参与上传

  • 做什么:允许 Developer 角色成员在不接触私钥文件的情况下上传构建。
  • 为什么值得做:云端签名把证书和私钥放在云端,Developer 角色只需要被授予 Access to Cloud Managed Distribution Certificate
  • 怎么开始:在 App Store Connect 中检查团队角色,为需要上传的 Developer 成员打开云端托管分发证书权限,然后让他们使用 Xcode 的自动签名分发。

为 Mac 版和 iOS 版共享应用记录

  • 做什么:让 iOS 应用和 Mac Catalyst 应用使用同一个 bundle ID,共享 App Store Connect 应用记录。
  • 为什么值得做:session 提到相同 bundle ID 的 Mac 应用会使用 iOS 版本的同一个应用记录,某些功能如 App 内购买可以共享。
  • 怎么开始:为现有 iOS 应用添加 Mac Catalyst 或原生 Mac 版本,评估是否沿用相同 bundle ID,再通过 Mac App Store 路径上传。

关联 Session

评论

GitHub Issues · utterances