跳到正文

← 全部工具

面向 iOS 和 Mac 开发者的免费工具

ExportOptions.plist 生成与检查

选好归档要以什么方式离开你的 Mac,得到一份 xcodebuild 能接受的 ExportOptions.plist,以及配套的归档和导出命令。也可以粘贴构建服务器上用的文件,看看 xcodebuild 会在哪里中止、哪些键被悄悄忽略、哪些旧名称该改。所有内容都不会上传。

键名、类型和默认值取自 Xcode 27.1 的 xcodebuild -help,核对于 2026-10-31。每种归档接受哪些 method、哪些可以上传,是用真实的 iOS 和 Mac 归档导出核实的。

归档平台
分发方式
去向

只有 App Store Connect、Developer ID(公证)和 validation 可以上传。

签名
App Store 选项
其他选项

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,拿来做构建服务器的起点很合适。

相关工具