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