Mac 簽章(除錯版本)

此應用程式通常由 scripts/package-mac-app.sh 建構,該腳本現在會:

  • 設定穩定的除錯 bundle identifier:ai.openclaw.mac.debug
  • 以該 bundle id 寫入 Info.plist(可透過 BUNDLE_ID=... 覆蓋)
  • 呼叫 scripts/codesign-mac-app.sh 簽章主要執行檔和應用程式 bundle,讓 macOS 將每次重新建構視為相同的已簽章 bundle 並保留 TCC 權限(通知、輔助使用、螢幕錄製、麥克風、語音辨識)。若要穩定的權限,請使用真正的簽章身分;ad-hoc 需選擇性加入且不穩定(參閱 macOS 權限)。
  • 預設使用 CODESIGN_TIMESTAMP=auto;為 Developer ID 簽章啟用可信賴的時間戳記。設定 CODESIGN_TIMESTAMP=off 可跳過時間戳記(離線除錯版本)。
  • 在 Info.plist 中注入建構中繼資料:OpenClawBuildTimestamp(UTC)和 OpenClawGitCommit(短 hash),讓 About 面板能顯示建構資訊、git commit 及除錯/發布頻道。
  • 打包預設使用 Node 24:腳本執行 TS 建構和 Control UI 建構。Node 22 LTS(目前為 22.16+)仍可相容使用。
  • 從環境變數讀取 SIGN_IDENTITY。在你的 shell rc 中加入 export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(或你的 Developer ID Application 憑證)即可永遠使用你的憑證簽章。Ad-hoc 簽章需透過 ALLOW_ADHOC_SIGNING=1SIGN_IDENTITY="-" 明確選擇加入(不建議用於權限測試)。
  • 簽章後執行 Team ID 稽核,若 app bundle 中有任何 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 權限

About 的建構中繼資料

package-mac-app.sh 在 bundle 中標記:

  • OpenClawBuildTimestamp:打包時的 ISO8601 UTC 時間
  • OpenClawGitCommit:短 git hash(或不可用時為 unknown

About 分頁讀取這些鍵值以顯示版本、建構日期、git commit,以及是否為除錯版本(透過 #if DEBUG)。程式碼變更後請執行打包器以更新這些值。

原因

TCC 權限與 bundle identifier 程式碼簽章綁定。未簽章的除錯版本因 UUID 每次都不同,導致 macOS 在每次重新建構後遺忘授權。簽章執行檔(預設 ad-hoc)並維持固定的 bundle id/路徑(dist/OpenClaw.app)能在建構間保留授權,與 VibeTunnel 的做法一致。