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 权限(通知、辅助功能、屏幕录制、麦克风、语音)。要获得稳定的权限,请使用真实的签名身份;ad-hoc 签名需要手动启用且不稳定(参见 macOS 权限)。 - 默认使用
CODESIGN_TIMESTAMP=auto;它会为 Developer ID 签名启用可信时间戳。设置CODESIGN_TIMESTAMP=off可跳过时间戳(离线调试构建)。 - 将构建元数据注入 Info.plist:
OpenClawBuildTimestamp(UTC 时间)和OpenClawGitCommit(短哈希),这样关于面板就能显示构建信息、git 信息和调试/发布渠道。 - 打包需要 Node 22+:脚本会运行 TS 构建和 Control UI 构建。
- 从环境变量读取
SIGN_IDENTITY。在你的 shell rc 文件中添加export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 证书)来始终使用你的证书签名。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 权限。
关于面板的构建元数据
package-mac-app.sh 会在包中添加以下信息:
OpenClawBuildTimestamp:打包时的 ISO8601 UTC 时间OpenClawGitCommit:短 git 哈希(如果不可用则为unknown)
关于标签页会读取这些键来显示版本、构建日期、git 提交,以及是否为调试构建(通过 #if DEBUG)。代码更改后运行打包器可刷新这些值。
为什么要这样做
TCC 权限与 bundle identifier 和 代码签名绑定。未签名的调试版本会有变化的 UUID,导致 macOS 在每次重新构建后忘记授权。对二进制文件签名(默认为 ad-hoc)并保持固定的 bundle id/路径(dist/OpenClaw.app)可以在构建之间保留授权,这与 VibeTunnel 的做法一致。