You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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界面归档时会按以下步骤自动执行:

  1. 清理构建产物:执行clean操作,移除之前的编译缓存和临时文件
  2. 编译构建:根据指定的Scheme、Configuration和目标平台,编译代码并生成未签名的.app包
  3. 代码签名:自动使用项目配置中的应用证书对.app包签名,同时嵌入对应的entitlements文件
  4. 生成归档包:将签名后的.app、符号表、构建元数据等打包成.xcarchive文件
  5. 导出分发包:根据导出向导选择的选项(如导出.app或.pkg),完成最终的签名和打包(若导出.pkg,会自动用安装器证书签名)

现有命令的问题排查与修正建议

  1. 归档阶段的签名处理
    你当前先以无签名方式归档,再手动执行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>
      
  2. 导出与安装包生成

    • 若你的目标是生成.pkg安装包,其实可以跳过xcodebuild -exportArchive步骤,直接基于归档后的签名.app生成pkg,你的这部分命令是可行的,但需确保productbuild的组件路径正确,执行后可验证pkg签名:pkgutil --check-signature export/App.pkg
    • 若需要同时导出.app分发包,需确保ExportOptions.plist的method配置正确(如developer-id对应外部分发,development对应内部测试)
  3. 证书指定的正确性

    • codesign中使用的-s参数直接指定证书名称或哈希值均可,确保钥匙串中存在该证书及对应的私钥
    • productsign同理,需确保安装器证书在钥匙串中可用

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:15:32