mac 签名(调试构建)

mac 签名(调试构建)

适用范围

在以下情况使用此页面:

  • 构建或签名 mac 调试构建

此应用通常从 scripts/package-mac-app.sh 构建,现在:

  • 设置稳定的调试捆绑标识符:com.clawdbot.mac.debug
  • 使用该捆绑 id 写入 Info.plist(通过 BUNDLE_ID=... 覆盖)
  • 调用 scripts/codesign-mac-app.sh 对主二进制文件和应用包进行签名,以便 macOS 将每次重建视为相同的签名包并保持 TCC 权限(通知、辅助功能、屏幕录制、麦克风、语音)。为了稳定的权限,请使用真实的签名身份;临时签名是选择加入且脆弱的(参见 macOS 权限)。
  • 默认使用 CODESIGN_TIMESTAMP=auto;它为 Developer ID 签名启用受信任的时间戳。设置 CODESIGN_TIMESTAMP=off 以跳过时间戳(离线调试构建)。
  • 将构建元数据注入 Info.plist:ClawdbotBuildTimestamp(UTC)和 ClawdbotGitCommit(短哈希),以便"关于"窗格可以显示构建、git 和调试/发布渠道。
  • 打包需要 Node 22+:脚本运行 TS 构建和控制 UI 构建。
  • 从环境读取 SIGN_IDENTITY。将 export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 证书)添加到你的 shell rc 以始终使用你的证书签名。临时签名需要通过 ALLOW_ADHOC_SIGNING=1SIGN_IDENTITY="-" 显式选择加入(不建议用于权限测试)。
  • 在签名后运行 Team ID 审计,如果应用包内的任何 Mach-O 由不同的 Team ID 签名,则会失败。设置 SKIP_TEAM_ID_CHECK=1 以绕过。

用法

# from repo root
scripts/package-mac-app.sh               # auto-selects identity; errors if none found
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh   # real cert
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh    # ad-hoc (permissions will not stick)
SIGN_IDENTITY="-" scripts/package-mac-app.sh        # explicit ad-hoc (same caveat)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh   # dev-only Sparkle Team ID mismatch workaround

临时签名注意事项

使用 SIGN_IDENTITY="-"(临时)签名时,脚本会自动禁用Hardened Runtime--options runtime)。这是为了防止应用在尝试加载不共享相同 Team ID 的嵌入式框架(如 Sparkle)时崩溃所必需的。临时签名还会破坏 TCC 权限持久性;请参阅 macOS 权限 了解恢复步骤。

关于的构建元数据

package-mac-app.sh 在捆绑包上标记:

  • ClawdbotBuildTimestamp:打包时的 ISO8601 UTC
  • ClawdbotGitCommit:短 git 哈希(或 unknown(如果不可用))

“关于"选项卡读取这些键以显示版本、构建日期、git 提交以及是否为调试构建(通过 #if DEBUG)。在代码更改后运行打包程序以刷新这些值。

原因

TCC 权限与捆绑标识符代码签名相关联。具有更改 UUID 的未签名调试构建导致 macOS 在每次重建后忘记授予。对二进制文件进行签名(默认为临时签名)并保持固定的捆绑 id/路径(dist/Clawdbot.app)可以在构建之间保留授予,与 VibeTunnel 方法匹配。