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
- Meet TestFlight on Mac — TestFlight 支持 macOS 应用,适合继续了解 Mac 应用测试分发。
- Faster and simpler notarization for Mac apps — Developer ID 分发会用到 notarization,这场讲命令行公证工具。
- Meet Xcode Cloud — 如果要把构建、测试和分发交给 Apple CI 服务,这是入口介绍。
- Explore Xcode Cloud workflows — 讲解 Xcode Cloud 如何配置归档和分发 workflow。
- Customize your advanced Xcode Cloud workflows — 适合需要环境变量、自定义脚本和外部服务集成的团队。
评论
GitHub Issues · utterances