ExportOptions.plist 生成与检查
选好归档要以什么方式离开你的 Mac,得到一份 xcodebuild 能接受的 ExportOptions.plist,以及配套的归档和导出命令。也可以粘贴构建服务器上用的文件,看看 xcodebuild 会在哪里中止、哪些键被悄悄忽略、哪些旧名称该改。所有内容都不会上传。
键名、类型和默认值取自 Xcode 27.1 的 xcodebuild -help,核对于 2026-10-31。每种归档接受哪些 method、哪些可以上传,是用真实的 iOS 和 Mac 归档导出核实的。
ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key> <string>app-store-connect</string> <key>destination</key> <string>export</string> <key>signingStyle</key> <string>automatic</string> <key>uploadSymbols</key> <true/> <key>manageAppVersionAndBuildNumber</key> <true/> </dict> </plist>
保存到项目旁边,用 -exportOptionsPlist 传给 xcodebuild。与所选方式无关的键不会写进去。
命令
1. 归档
xcodebuild archive \ -scheme YourScheme \ -destination 'generic/platform=iOS' \ -archivePath build/YourApp.xcarchive
2. 导出
xcodebuild -exportArchive \ -archivePath build/YourApp.xcarchive \ -exportPath build/export \ -exportOptionsPlist ExportOptions.plist \ -allowProvisioningUpdates
xcodebuild 读取的全部 18 个键
- method string
- 归档的导出方式。默认 debugging。
- destination string
- export 把文件写到 -exportPath;upload 把构建传给 Apple。默认 export。
- teamID string
- 本次导出用的开发团队。默认用归档里的团队。
- signingStyle string
- 手动(manual),或由 Xcode 管理。默认沿用归档时的签名方式。
- signingCertificate string
- 仅手动签名:证书名称、SHA-1 指纹,或会选本机最新证书的名称。
- provisioningProfiles dict
- 仅手动签名:Bundle ID → 描述文件名称或 UUID,应用和每个扩展都要有。
- installerSigningCertificate string
- 仅 Mac 安装包:安装包证书,如 Mac Installer Distribution。
- uploadSymbols boolean
- App Store 导出:包含符号。默认 YES。
- manageAppVersionAndBuildNumber boolean
- App Store 导出:上传时由 Xcode 管理构建号。默认 YES。
- testFlightInternalTestingOnly boolean
- App Store 导出:这个构建只能给 TestFlight 内部测试员。
- generateAppStoreInformation boolean
- App Store 导出:为 iTMSTransporter 生成 App Store 信息。默认 NO。
- stripSwiftSymbols boolean
- 去掉 .ipa 里 Swift 库的符号。默认 YES。
- iCloudContainerEnvironment string
- CloudKit 用 Development 还是 Production。默认与签名方式一致。
- distributionBundleIdentifier string
- 只导出这个 Bundle ID 的目标。默认顶层那个。
- thinning string
- App Store 之外:<none>、<thin-for-all-variants>,或 iPhone7,1 这样的设备。
- manifest dict
- App Store 之外:网页安装用的 appURL、displayImageURL、fullSizeImageURL。
- embedOnDemandResourcesAssetPacksInBundle boolean
- App Store 之外:把按需资源放进应用包里。
- onDemandResourcesAssetPacksBaseURL string
- App Store 之外:按需资源包放在哪个网址。
工作原理
- •每个键都来自 Xcode 27.1 里 xcodebuild -help 打印的列表,含类型和默认值。
- •我们用这个页面生成的文件、以及故意写错的文件,导出了真实的 iOS 和 Mac 归档,看 xcodebuild 实际怎么处理:值类型不对会中止导出;不认识或拼错的键会被直接忽略,没有任何提示。iOS 归档接受 app-store-connect、release-testing、enterprise、debugging、validation;Mac 归档接受 app-store-connect、developer-id、debugging、mac-application、validation。
- •只写入与所选方式和签名有关的键,文件内容一看就懂。App Store 相关开关即使是默认值也会写出来。
- •检查器读取粘贴或拖入的文件,指出旧的 method 名称(app-store、ad-hoc、development)、bitcode 相关键、大小写写错的键、不能上传的方式却设了 upload、会被忽略的手动签名键,以及只对另一类导出有效的键。
它不做什么
- •它看不到你的钥匙串和开发者账号。证书和描述文件是否存在,要等 xcodebuild 签名时才知道。
- •它不读取二进制 plist。请先用 plutil -convert xml1 转换。
- •命令里的路径是占位符,凭据用环境变量;请把 YourScheme 和路径换成你项目里的。
常见问题
- ExportOptions.plist 是什么?
- xcodebuild -exportArchive -exportOptionsPlist 读取的属性列表,用来把 .xcarchive 导出成 .ipa、Mac 应用或安装包,或者直接上传。它决定分发方式、签名,以及符号、构建号等几个选项。
- app-store、ad-hoc、development 换成了什么?
- 分别是 app-store-connect、release-testing 和 debugging。iOS 归档仍接受旧名称,但 Mac 归档不接受 ad-hoc。
- xcodebuild 能直接上传到 App Store Connect 吗?
- 能。把 method 设为 app-store-connect、destination 设为 upload,导出时加 -allowProvisioningUpdates。在构建服务器上,用 -authenticationKeyPath、-authenticationKeyID、-authenticationKeyIssuerID 以 App Store Connect API 密钥登录。
- 导出报 “Failed to decode … Expected to decode Bool” 怎么办?
- 某个值的类型不对,比如该写 <true/> 的地方写成了 <string>YES</string>。把文件粘贴到检查器里就能看到是哪个键。
- 还需要 compileBitcode 或 uploadBitcode 吗?
- 不需要。Xcode 14 去掉了 bitcode,现在的 xcodebuild 会忽略这两个键,删掉即可。
- 去哪里找 Xcode 用过的 ExportOptions.plist?
- 在 Organizer 里分发 iOS 应用并导出到文件夹时,Xcode 会在 .ipa 旁边写一份 ExportOptions.plist,拿来做构建服务器的起点很合适。