← 返回技术实践

CI/CD 实践

Claude Code 2026 如何在云端 Mac 完成 macOS 应用签名与公证?

约 9 分钟阅读

Claude Code 2026 如何在云端 Mac 完成 macOS 应用签名与公证?

数据 → 解法: Apple 表示,公证扫描通常少于 1 小时,但这不是交付时限保证。(Apple 公证 macOS 软件说明) 所以,Claude Code 可以协助执行发布命令,但签名、公证票据和最终产物必须以 macOS 工具链的实际输出验收;涉及 Apple 签名凭据的任务,应放在权限受控、结束后可清理的 Mac 环境中。

这篇指南适合没有常驻 Mac、需要准备 macOS 发布的独立开发者。
也适合希望将 Claude Code 纳入可审计构建流程的发布工程师。
如果你负责签名凭据或远程执行环境,重点看凭据边界与放行条件。

发布渠道:先分清 Mac App Store 与 Developer ID

两条发布路线的签名身份和验收流程不同,不要将它们拼成一套流水线。Mac App Store 分发使用 Apple Distribution 身份并提交到 App Store Connect;独立分发给用户则使用 Developer ID Application 身份,并按 Apple 的公证流程准备产物。Apple 说明,两种分发方式对应不同流程,应按目标渠道选择签名身份和验收方式。(macOS 分发签名文档)

发布选项 签名与交付 你需要重点验收
Mac App Store 使用 Apple Distribution 身份,上传到 App Store Connect 上传构建的接收状态、版本与团队记录;上传不等于审核通过或正式上架
Developer ID 独立分发 使用 Developer ID Application 身份;准备面向用户的分发文件并公证 签名有效、公证状态与日志、票据装订状态、最终分发文件可验证

App Store Connect 上传后,构建还需经过处理才会出现在相应记录中;应核对上传构建的官方说明。Claude Code 可以协助检查设置、整理命令、运行测试或生成日志,但证书身份选择、凭据授权以及最终发布决定都应由责任人把关。Claude Code 的 CLI 提供工具权限与确认相关选项;不要为了无人值守而默认跳过权限提示,再把签名和发布权限一并交给 Agent。(Claude Code CLI 权限选项)

环境准备:把构建证据留在产物旁边

云端 Mac 的价值不只是能运行 macOS 命令。你还需要确认工具链和构建输入可复现,避免 Agent 报告“构建成功”,却没有留下可检查的归档或应用包。

交给 Claude Code 之前,先记录以下信息:

  • 构建入口: 是 Xcode 工程、Swift Package、make,还是项目自己的构建脚本。
  • 工具链选择: 使用哪个 Xcode 或命令行工具;多套 Xcode 共存时,确认当前选择。
  • 构建输入: 依赖锁定文件、构建配置、目标架构、Bundle ID 和版本号。
  • 产物位置: 约定归档、.app、日志与导出包保存到哪个目录。
  • 执行身份: 哪个用户运行构建与签名;不要让签名步骤切换到无法读取预期钥匙串的账户。

如果项目使用 Xcode,可把下面命令中的 scheme、配置和路径换成项目实际值:

xcodebuild \
  -scheme "YourScheme" \
  -configuration Release \
  -archivePath "build/YourApp.xcarchive" \
  archive

归档命令退出成功并不是唯一证据。确认 .xcarchive 确实生成,检查其中的应用、版本标识和构建日志;再按分发方式导出待签名或已签名产物。若使用外部构建系统,先明确哪个任务负责签名、哪个步骤负责打包,别让 Agent 根据猜测补齐构建约定。前文的 Apple 分发签名文档也说明了 Xcode 工程与外部构建系统可能采用不同的签名步骤。

凭据隔离:让工作流可授权、可撤回

签名证书和公证凭据的风险,不只在于误传到公开仓库。它们也可能进入 Agent 提示词、Shell 历史、调试输出、缓存目录或保留时间过长的工作空间。把密钥放进环境变量,并不自动意味着子进程或日志无法接触它。

凭据方案 适用场景 主要风险与控制点
受控钥匙串中的签名身份 需要在 Mac 上执行签名的发布任务 只向任务用户提供必要身份;不把证书密码写入仓库或命令行历史;任务结束检查钥匙串访问权限
notarytool 钥匙串配置 Developer ID 公证认证 用凭据配置名调用工具,不在脚本明文保存口令;限制执行账号与配置的可见范围
临时注入的密钥文件 团队已有密钥管理和清理机制时 控制读取权限、生命周期与日志脱敏;结束或失败时清理,并验证文件确实消失

Apple 文档说明,notarytool 可将公证凭据存入钥匙串,并在提交时通过配置名引用;也可使用 API 密钥认证。凭据的保管和清理仍应由你的环境管理流程负责。(Apple 自定义公证工作流文档)

建议把 Agent 的权限拆成两段:先允许它检查项目并生成构建、签名和验收计划;确认目标身份、产物路径与命令后,再由授权人员提供执行权限。生产凭据不要出现在会话内容中。若自动化任务不需要独立决定发布,可把“提交公证”与“对外发布”设成不同门禁。

Developer ID:从内到外签名并逐项验证

独立分发通常要使用 Developer ID Application 身份。Apple 对公证分发要求相应的签名条件,包括启用 Hardened Runtime、使用安全时间戳,以及避免把开发调试 entitlement 带入正式应用;具体设置可对照 Hardened Runtime 文档。Apple 还说明,自 2023 年 11 月 1 日起,公证服务不再接受 altool 或 Xcode 13 及更早版本的上传;新流程应使用当前文档指定的工具。

先确认当前签名身份是否存在:

security find-identity -p codesigning -v

签名应用后,不要只看外层 .app。若其中含有框架、插件、辅助工具或其他嵌套代码,应按内层到外层的顺序完成签名。再检查应用包和相关组件:

codesign --verify --deep --strict --verbose=2 "build/YourApp.app"
codesign -d -vv "build/YourApp.app"

把完整命令输出和执行时间写入构建记录。若签名失败,先检查实际身份、嵌套组件签名状态、entitlements 和构建输入;不要让 Agent 不断尝试不同证书或改写权限配置。签名命令和身份选择可参照前文的 Apple macOS 分发签名说明。

公证交付:区分提交、结果与票据

上传成功只说明文件已提交,不代表公证已通过,更不代表最终分发包已经装订并完成验证。每次提交都应留存提交编号、公证日志和对应产物的校验记录,确保日后能追溯日志对应哪个版本。

按分发格式安排以下操作:

  1. 完成 Developer ID 签名,并对应用包及嵌套代码运行签名验证。
  2. 创建待提交文件,确认它与实际准备分发的格式一致。
  3. 使用 notarytool 提交并等待结果,保存提交编号。
  4. 下载公证日志,检查错误与警告;状态不是 Accepted 时暂停。
  5. 对支持装订的目标执行 stapler staple,再运行 stapler validate。
  6. 验证最终交付文件;ZIP 不能直接装订,需处理其中的应用等项目,再重新制作供分发的 ZIP。
  7. Gatekeeper 评估与其他验收均通过后,才进入人工放行。

提交命令可参考下面的形式,凭据配置名应由你的密钥管理流程提供:

xcrun notarytool submit "build/YourApp.dmg" \
  --keychain-profile "NOTARY_PROFILE" \
  --wait

若返回提交编号,继续下载日志,而不是立即发布:

xcrun notarytool log "SUBMISSION_ID" \
  --keychain-profile "NOTARY_PROFILE" \
  "build/notary-log.json"

Apple 的自定义公证工作流要求检查结果与日志,并说明 ZIP 不能直接装订票据;处理其中项目后应重新打包。

最后针对实际交付文件运行适用的检查,例如:

xcrun stapler validate "build/YourApp.dmg"
spctl --assess --type execute --verbose=2 "build/YourApp.app"

若是安装包,应按目标类型执行评估。日志有警告、装订验证失败,或最终文件与提交文件不是同一份产物,都应先停下排查。Apple 的Mac 软件打包说明建议在干净的分发环境中测试最终文件。

发布复核:用门禁而不是 Agent 的口头确认放行

准备一份能由另一位工程师复核的发布记录,至少包含:仓库版本或提交标识、构建配置与产物路径、签名身份及验证输出、公证提交编号与日志、票据装订结果、最终文件校验信息,以及批准人记录。不要把凭据本身写进记录。

发布前逐项检查:

  • 产物一致: 公证对象、验收对象与准备上传或交付的文件相匹配。
  • 签名有效: 应用及嵌套代码验证通过,身份符合选定的分发渠道。
  • 公证闭环: 结果已确认,日志已留存,适用的票据已装订并验证。
  • 权限收回: 临时密钥文件、钥匙串访问和任务账号权限已按流程清理或撤销。
  • 人工批准: 责任人核对版本与证据后,明确授权发布。

缺少任何一项,就暂停发布。Agent 能帮你执行命令和整理证据,但无法替团队承担证书授权与上线责任;这也是需要谨慎设置 Claude Code 命令权限的原因。

FAQ:自动化与验收边界

Claude Code 能替你完成哪些签名操作?

它可以在具备相应工具和权限的 Mac 环境中协助调用构建与签名命令,但实际执行取决于环境配置。你仍需确认签名身份和命令输出;不要因为会话回复称“已签名”就认定产物有效,也不要默认开放跳过确认的权限。签名是否通过,应以 codesign 等工具对实际应用包的检查结果为准。

云端 Mac 上如何控制签名与公证凭据的暴露?

公证认证可使用 notarytool 钥匙串凭据配置;签名身份也应通过受控的密钥保管流程提供。避免将凭据写入仓库、提示词、日志或长期工作目录。任务结束后,检查临时文件、钥匙串权限与执行账号,并按组织策略清理或撤销访问。生产发布与不含真实密钥的测试任务应分开授权。

公证服务接受提交后,还要核对哪些证据?

核对提交编号和状态,保存并检查公证日志;随后验证适用的票据已装订到最终分发对象,并对实际交付文件运行相应的签名和 Gatekeeper 检查。若警告尚未评估、票据验证失败,或产物与公证提交对象不一致,就先不要发布。Accepted 是一个阶段性结果,不应替代对最终文件的验收。

从签名到打包,发布任务如何安排顺序?

先构建应用,再按内层到外层签名并验证;然后按分发格式打包并提交公证。收到结果后检查日志、装订适用票据,再验证最终交付文件。ZIP 不能直接装订,需处理其中的应用等项目后重新创建 ZIP。将提交和上线设为独立门禁,能避免公证结果尚未核验时文件已对外发布。

如果你现在用个人 Mac 处理发布,常见代价是设备需要持续维护、构建与签名环境难以隔离、临时任务结束后不易统一清理;普通非 Mac 执行环境也无法直接替代 macOS 签名与验证环节。对于偶发发布或短期验收,受控的远程 Mac 环境可以避免为单次任务长期维护一台机器;若你有持续重负载、固定物理接口或必须常驻的签名环境,自购设备可能更合适。需要临时执行环境时,可先查看 Kvmkit 的 Mac mini 租用选项和帮助中心,了解使用前需确认的事项。已有远程环境的话,先用不含真实密钥的测试项目跑完构建、签名、公证、装订和验收,再决定是否接入生产凭据。

常见问题

Claude Code 可以直接替我完成 macOS 应用签名吗?

Claude Code 可以协助运行构建和签名命令,但能否执行取决于当前环境、凭据是否可用以及工具权限。不要把它给出的“签名成功”文字当验收证据;你要自行核对签名身份、`codesign` 验证结果和最终分发文件,并由发布责任人决定是否放行。

云端 Mac 上怎样保存签名和公证凭据更稳妥?

不要把证书密码、私钥或公证口令提交到仓库、提示词、构建日志或长期保留的工作目录。公证认证可用 `notarytool` 的钥匙串凭据配置;签名身份则应交由受控的钥匙串或密钥管理流程提供。任务结束后检查临时钥匙串、密钥文件和会话权限,并按团队策略清理或撤销凭据。

公证显示 Accepted 后,还需要检查什么?

先用提交编号下载并保留公证日志,检查是否有警告或问题;再确认票据已装订到最终要交付的应用或容器,并运行 `stapler validate`。最后对实际分发的 DMG、PKG 或 ZIP 做签名与 Gatekeeper 验证。Accepted 代表公证服务接受该次提交,不等于你手里的最终打包文件已经完成验收。

签名、公证和 DMG 或 ZIP 打包应该按什么顺序做?

先完成构建,再从嵌套可执行文件向外签名并验证应用;接着按选定的分发格式打包、提交公证并确认结果。对支持装订的最终产物装订票据并验证。ZIP 本身不能直接装订:需要对其中的应用等项目装订,再重新制作供分发的 ZIP。发布流水线应记录每个阶段对应的产物与日志。

把 CI/CD 放在 M4 Mac mini 上,才算真正省心

本文所有流程——Xcode、Fastlane、CocoaPods、SPM——在 macOS 上都是原生一等公民。Mac mini M4 统一内存架构让签名、归档、上传不再互相拖累,~4W standby power suits 24/7 build nodes.

查看 Kvmkit 套餐方案

需要技术支持或选型建议?

在使用 Mac 实例或 CI/CD 流水线过程中遇到问题,可先查看帮助中心;下单与计价见定价页。