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=1或SIGN_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 的做法一致。