macOS 应用签名通过 scripts/package-mac-app.sh 脚本实现,该脚本负责设置 Bundle ID、签名二进制文件、注入构建元数据(例如"OpenClawBuildTimestamp"),并通过稳定的身份和路径保留 TCC 权限。
签名流程
OpenClaw 使用自动化脚本处理代码签名:
# 执行签名和打包
./scripts/package-mac-app.sh
签名要求
- 证书类型:使用 Apple Development 或 Developer ID 证书
- Bundle ID:保持 Bundle ID 稳定以维持权限
- 签名一致性:使用真实证书确保签名在重建时保持稳定
- 时间戳:注入构建时间戳用于版本跟踪
构建元数据
签名脚本会注入以下元数据:
- OpenClawBuildTimestamp:构建时间戳
- 版本信息:应用版本和构建号
- 签名标识:代码签名身份信息
权限保留
稳定的签名对于保留 macOS TCC 权限至关重要:
- 使用固定的安装路径(例如
dist/OpenClaw.app) - 保持 Bundle ID 不变
- 使用真实证书而非临时签名
- 在开发和生产环境使用相同的签名配置
临时签名警告
临时签名(ad-hoc)会在每次构建时生成新的身份,导致 macOS 遗忘之前的权限授予。生产环境和测试权限时,始终使用真实的 Apple 开发者证书。
签名验证
验证应用签名状态:
# 检查代码签名
codesign -vv -d dist/OpenClaw.app
# 验证签名有效性
codesign --verify --deep --strict --verbose=2 dist/OpenClaw.app
# 查看签名身份
codesign -d --extract-certificates dist/OpenClaw.app
开发环境配置
- 在 Xcode 中配置开发者账户
- 下载并安装 Development 或 Developer ID 证书
- 配置代码签名身份到构建脚本
- 确保钥匙串中证书可访问
公证流程
macOS 10.15+ 要求应用通过公证:
- 使用 Developer ID 证书签名
- 配置公证凭证(Apple ID 和应用专用密码)
- 通过
xcrun notarytool提交公证 - 将公证票据附加到应用
最佳实践
将签名和公证集成到 CI/CD 流程中,确保每个发布版本都正确签名和公证。使用环境变量管理证书和凭证,避免硬编码敏感信息。