如何通过xcodebuild用Mac Developer与Mac Installer证书导出Mac App
macOS App命令行自动化归档与签名问题
需求背景
原本通过Xcode界面完成Mac App的导出流程,现需转为命令行自动化操作,涉及两种证书:
- 主应用证书:
Apple Distribution: Company LTD (CompanyID) - 安装器证书:
3rd Party Mac Developer Installer: Company LTD (CompanyID)
已编写部分命令,但不确定证书指定的正确方式,同时希望了解Xcode原生归档流程,排查当前操作的遗漏步骤。
现有命令
xcodebuild -project "App.xcodeproj" -scheme "App" -configuration "Release" -destination "generic/platform=macOS,name=Any Mac" clean archive -archivePath export/App.xcarchive -verbose CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO codesign --entitlements "/Production.entitlements" -f -s "Apple Distribution: Company LTD (CompanyID)" "export/App.xcarchive/Products/Applications/App.app" xcodebuild -exportArchive -archivePath export/App.xcarchive -exportOptionsPlist "Support/ExportOptions.plist" -exportPath "export" productbuild --component "export/App.xcarchive/Products/Applications/App.app" /Applications "export/App_unsigned.pkg" productsign --sign "3rd Party Mac Developer Installer: Company LTD (CompanyID)" "export/App_unsigned.pkg" "export/App.pkg"
Xcode原生归档完整流程
Xcode界面归档时会按以下步骤自动执行:
- 清理构建产物:执行
clean操作,移除之前的编译缓存和临时文件 - 编译构建:根据指定的Scheme、Configuration和目标平台,编译代码并生成未签名的
.app包 - 代码签名:自动使用项目配置中的应用证书对
.app包签名,同时嵌入对应的entitlements文件 - 生成归档包:将签名后的
.app、符号表、构建元数据等打包成.xcarchive文件 - 导出分发包:根据导出向导选择的选项(如导出
.app或.pkg),完成最终的签名和打包(若导出.pkg,会自动用安装器证书签名)
现有命令的问题排查与修正建议
归档阶段的签名处理
你当前先以无签名方式归档,再手动执行codesign,这种方式可行,但需注意:- 确保
entitlements文件路径正确,签名后可执行codesign -vvv export/App.xcarchive/Products/Applications/App.app验证签名有效性 - 后续
exportArchive步骤需配合正确的ExportOptions.plist,避免重复签名冲突。建议在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>developer-id</string> <!-- 对应Mac分发的开发者ID类型 --> <key>signingStyle</key> <string>manual</string> <key>skipSigning</key> <true/> <!-- 因为已经手动签名,跳过自动签名 --> </dict> </plist>
- 确保
导出与安装包生成
- 若你的目标是生成
.pkg安装包,其实可以跳过xcodebuild -exportArchive步骤,直接基于归档后的签名.app生成pkg,你的这部分命令是可行的,但需确保productbuild的组件路径正确,执行后可验证pkg签名:pkgutil --check-signature export/App.pkg - 若需要同时导出
.app分发包,需确保ExportOptions.plist的method配置正确(如developer-id对应外部分发,development对应内部测试)
- 若你的目标是生成
证书指定的正确性
codesign中使用的-s参数直接指定证书名称或哈希值均可,确保钥匙串中存在该证书及对应的私钥productsign同理,需确保安装器证书在钥匙串中可用
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

