Appearance
macOS 签名(Debug 构建)
本应用通常由 scripts/package-mac-app.sh 构建,该脚本现在会:
- 设置稳定的调试 Bundle Identifier:
ai.openclaw.mac.debug - 将 Info.plist 写入该 Bundle ID(可通过
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 24:脚本运行 TS 构建和 Control UI 构建。Node 22 LTS(当前
22.14+)仍作为兼容性支持。 - 从环境变量读取
SIGN_IDENTITY。将export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 证书)添加到 shell rc,以便始终使用你的证书签名。临时签名需通过ALLOW_ADHOC_SIGNING=1或SIGN_IDENTITY="-"显式开启(不推荐用于权限测试)。 - 签名后运行 Team ID 审计,若应用包内任何 Mach-O 由不同 Team ID 签名则构建失败。设置
SKIP_TEAM_ID_CHECK=1可绕过此检查。
用法
bash
# 从仓库根目录执行
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 # 临时签名(权限不会持久化)
SIGN_IDENTITY="-" scripts/package-mac-app.sh # 显式临时签名(同上注意事项)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # 仅开发用:Sparkle Team ID 不匹配的解决方法临时签名说明
使用 SIGN_IDENTITY="-"(临时签名)时,脚本会自动禁用 Hardened Runtime(--options runtime)。这是为了防止应用在加载不共享相同 Team ID 的内嵌框架(如 Sparkle)时崩溃。临时签名还会破坏 TCC 权限持久化;恢复步骤请参见 macOS 权限。
构建元数据(关于面板)
package-mac-app.sh 会在包中打入:
OpenClawBuildTimestamp:打包时的 ISO8601 UTC 时间OpenClawGitCommit:短 git 哈希(不可用时为unknown)
"关于"标签页通过读取这些键来显示版本、构建日期、git 提交,以及是否为调试构建(通过 #if DEBUG)。每次代码修改后运行打包脚本以刷新这些值。
为什么要签名
TCC 权限与 Bundle Identifier 和代码签名绑定。带有变化 UUID 的未签名调试构建会导致 macOS 每次重新构建后忘记授权。对二进制文件签名(默认为临时签名)并保持固定的 Bundle ID/路径(dist/OpenClaw.app),可在构建之间保留授权——这与 VibeTunnel 的做法相同。
养龙虾心得:想让你的龙虾记住权限,就得给它一个稳定的"身份证"——正确签名和固定路径,缺一不可。