Mac 签名(调试构建)
此应用通常从scripts/package-mac-app.sh 构建,该脚本目前会:
- 设置稳定的调试 Bundle 标识符:
ai.openclaw.mac.debug - 使用该 Bundle ID 写入 Info.plist(可通过
BUNDLE_ID=...覆盖) - 调用
scripts/codesign-mac-app.sh对主二进制文件和应用包进行签名,使 macOS 将每次重新构建视为相同的已签名包,并保留 TCC 权限(通知、辅助功能、屏幕录制、麦克风、语音)。要获得稳定的权限,请使用真实签名身份;临时签名是可选的且不稳定(参阅 macOS 权限)。 - 默认使用
CODESIGN_TIMESTAMP=auto;为 Developer ID 签名启用受信任的时间戳。设置CODESIGN_TIMESTAMP=off可跳过时间戳(离线调试构建)。 - 将构建元数据注入 Info.plist:
OpenClawBuildTimestamp(UTC)和OpenClawGitCommit(短哈希),以便”关于”面板可以显示构建信息、git 信息和调试/发布渠道。 - 打包需要 Node 22+:脚本会运行 TS 构建和 Control UI 构建。
- 从环境变量中读取
SIGN_IDENTITY。将export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 证书)添加到 shell 配置文件中,以始终使用你的证书签名。临时签名需要通过ALLOW_ADHOC_SIGNING=1或SIGN_IDENTITY="-"显式启用(不建议用于权限测试)。 - 签名后运行 Team ID 审计,如果应用包内的任何 Mach-O 文件由不同的 Team ID 签名则会失败。设置
SKIP_TEAM_ID_CHECK=1可跳过此检查。
用法
临时签名注意事项
使用SIGN_IDENTITY="-"(临时签名)签名时,脚本会自动禁用强化运行时(--options runtime)。这是为了防止应用在尝试加载不共享相同 Team ID 的嵌入式框架(如 Sparkle)时崩溃。临时签名还会破坏 TCC 权限持久化;参阅 macOS 权限 了解恢复步骤。
关于面板的构建元数据
package-mac-app.sh 会在包中标记以下信息:
OpenClawBuildTimestamp:打包时的 ISO8601 UTC 时间OpenClawGitCommit:短 git 哈希(不可用时为unknown)
#if DEBUG)。代码更改后运行打包程序以刷新这些值。
原因
TCC 权限与 Bundle 标识符和代码签名绑定。使用不断变化的 UUID 的未签名调试构建会导致 macOS 在每次重新构建后忘记授权。对二进制文件进行签名(默认临时签名)并保持固定的 Bundle ID/路径(dist/OpenClaw.app)可以在构建之间保留授权,与 VibeTunnel 的方案一致。