mac 签名(调试构建)
此应用通常由 scripts/package-mac-app.sh 构建,现在它:
- 设置一个稳定的调试 bundle identifier:ai.openclaw.mac.debug
- 使用该 bundle id 写入 Info.plist(通过 BUNDLE_ID=... 覆盖)
- 调用 scripts/codesign-mac-app.sh 签名主二进制文件和应用包,以便 macOS 将每次重建视为相同的签名包并保留 TCC 权限(notifications、accessibility、screen recording、mic、speech)。对于稳定的权限,使用真实的签名身份;ad-hoc 是可选的且脆弱(参见 macOS permissions)。
- 默认使用 CODESIGN_TIMESTAMP=auto;它为 Developer ID 签名启用可信时间戳。设置 CODESIGN_TIMESTAMP=off 跳过时间戳(离线调试构建)。
- 将构建元数据注入 Info.plist:OpenClawBuildTimestamp(UTC)和 OpenClawGitCommit(短哈希),以便 About 面板可以显示构建、git 和调试/发布频道。
- 打包需要 Node 22+:脚本运行 TS 构建和 Control UI 构建。
- 从环境读取 SIGN_IDENTITY。将 export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 证书)添加到你的 shell rc 以始终使用你的证书签名。Ad-hoc 签名需要通过 ALLOW_ADHOC_SIGNING=1 或 SIGN_IDENTITY="-" 明确选择(不推荐用于权限测试)。
- 签名后运行 Team ID 审计,如果应用包内的任何 Mach-O 由不同的 Team ID 签名则失败。设置 SKIP_TEAM_ID_CHECK=1 绕过。
用法
# 从仓库根目录
scripts/package-mac-app.sh # 自动选择身份;如果未找到则错误
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh # 真实证书
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc(权限将不会保留)
SIGN_IDENTITY="-" scripts/package-mac-app.sh # 明确 ad-hoc(相同警告)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # 仅开发的 Sparkle Team ID 不匹配解决方法
Ad-hoc 签名注意事项
使用 SIGN_IDENTITY="-"(ad-hoc)签名时,脚本自动禁用 Hardened Runtime(--options runtime)。这是必要的,以防止应用尝试加载不共享相同 Team ID 的嵌入式框架(如 Sparkle)时崩溃。Ad-hoc 签名还会破坏 TCC 权限持久性;参见 macOS permissions 了解恢复步骤。
About 的构建元数据
package-mac-app.sh 用以下内容标记包:
- OpenClawBuildTimestamp:打包时的 ISO8601 UTC
- OpenClawGitCommit:短 git 哈希(如果不可用则为 unknown)
About 选项卡读取这些键以显示版本、构建日期、git 提交以及是否是调试构建(通过 #if DEBUG)。代码更改后运行打包器以刷新这些值。
为什么
TCC 权限与 bundle identifier 和代码签名绑定。每次重建后使用更改 UUID 的未签名调试构建导致 macOS 忘记授权。签名二进制文件(默认为 ad-hoc)并保持固定的 bundle id/path(dist/OpenClaw.app)在构建之间保留授权,匹配 VibeTunnel 方法。