--- name: macos-app-distribution description: 当用户要求检查或生成个人 macOS 应用的 Developer ID 签名、公证和分发包,或排查 Gatekeeper 拒绝时使用。正式发布优先沿用项目 CI。 --- # macOS 签名与分发验证 先读项目构建/发布规则和现有 CI。正式发布复用既有入口;仅在本次明确需要本地签名公证时使用随包脚本,不另造远程部署。 ## 分发渠道 Developer ID 可用于直接下载分发;App Store 需按实际功能、沙箱、权限与审核规则评估。包含 helper/CLI 或监听端口不自动代表不能上架。分别核实项目架构与权限,不作一刀切结论。 ## 本地适配器 传入已经构建的 app 和一个尚不存在的输出路径: ```bash SIGN_IDENTITY="" NOTARY_PROFILE="<本机keychain profile>" \ bash "<本技能目录>/scripts/sign-notarize-macos.sh" "" "" ``` - SIGN_IDENTITY 和公证 profile 来自本机配置,密钥不得进入 skill 或项目仓库。 - ENTITLEMENTS 只描述主 app 权限。存在框架、插件、XPC、helper 或其它 Mach-O 时必须指定项目 NESTED_SIGN_SCRIPT;该脚本接收 app 路径,按项目组件各自权限从内到外签名。 - 不用 codesign --deep 给所有组件统一签名;--deep 可用于最终验证。 - 主 app 和 DMG 分别签名,核对请求身份与 Team。此适配器要求完整 Developer ID 身份名称;证书哈希选择等特殊方式沿用项目原签名流程。 - notarytool 的真实结果必须 Accepted,再执行 staple、ticket 验证、DMG 与内含 app 的适用 Gatekeeper 检查。任一失败均返回非零,不打印完成。 - SKIP_NOTARIZE=1 只做本地签名包装,不需要公证 profile,明确记录公证未请求。 回执包括源码来源/dirty、bundle ID、版本/build、架构、产物路径、SHA-256、公证 request ID、实际签名与安装检查。脚本成功仍不能替代目标电脑的功能验收。对外上传与生产发布遵循本次授权和项目门禁。 官方依据:[组件签名](https://developer.apple.com/documentation/xcode/creating-distribution-signed-code-for-the-mac/)、[沙箱 helper](https://developer.apple.com/documentation/xcode/embedding-a-helper-tool-in-a-sandboxed-app)、[DMG 打包](https://developer.apple.com/documentation/xcode/packaging-mac-software-for-distribution)。 本版已完成失败阻断、跳过公证及组件入口的模拟回归;未进行真实签名、公证或目标电脑验收。