Mac 署名(デバッグビルド)
このアプリは通常 scripts/package-mac-app.sh からビルドされます。現在は次のことを行います:
- 安定したデバッグバンドル識別子を設定: ai.openclaw.mac.debug
- そのバンドル ID で Info.plist を書き込みます(BUNDLE_ID=... 経由でオーバーライド)
- scripts/codesign-mac-app.sh を呼び出してメインバイナリとアプリバンドルに署名し、macOS が各再ビルドを同じ署名されたバンドルとして扱い、TCC パーミッション(通知、アクセシビリティ、画面録画、マイク、スピーチ)を保持するようにします。安定したパーミッションのためには、実際の署名 ID を使用してください。アドホックはオプトインで脆弱です(macOS パーミッション を参照)。
- デフォルトで CODESIGN_TIMESTAMP=auto を使用します。Developer ID 署名の信頼されたタイムスタンプを有効にします。オフラインデバッグビルドの場合は CODESIGN_TIMESTAMP=off を設定してタイムスタンプをスキップします。
- Info.plist にビルドメタデータを注入: OpenClawBuildTimestamp(UTC)と OpenClawGitCommit(短いハッシュ)。これにより、About ペインにビルド、git、およびデバッグ/リリースチャネルを表示できます。
- パッケージングには Node 22+ が必要: スクリプトは TS ビルドと Control UI ビルドを実行します。
- 環境から SIGN_IDENTITY を読み取ります。常に証明書で署名するには、シェル rc に export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)"(または Developer ID Application 証明書)を追加します。アドホック署名には ALLOW_ADHOC_SIGNING=1 または SIGN_IDENTITY="-" による明示的なオプトインが必要です(パーミッションテストには推奨されません)。
- 署名後に Team ID 監査を実行し、アプリバンドル内の任意の Mach-O が異なる Team ID で署名されている場合は失敗します。バイパスするには SKIP_TEAM_ID_CHECK=1 を設定します。
使用方法
# リポジトリルートから
scripts/package-mac-app.sh # 自動的に ID を選択。見つからない場合はエラー
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 パーミッション を参照してください。
About のビルドメタデータ
package-mac-app.sh はバンドルに以下をスタンプします:
- OpenClawBuildTimestamp: パッケージ時の ISO8601 UTC
- OpenClawGitCommit: 短い git ハッシュ(利用できない場合は unknown)
About タブはこれらのキーを読み取り、バージョン、ビルド日、git コミット、およびデバッグビルドかどうか(#if DEBUG 経由)を表示します。コード変更後にこれらの値を更新するには、パッケージャーを実行します。
理由
TCC パーミッションはバンドル識別子*およびコード署名に紐付けられています。UUID が変化する署名されていないデバッグビルドは、macOS が各再ビルド後に許可を忘れる原因となっていました。バイナリに署名し(デフォルトでアドホック)、固定のバンドル ID/パス(dist/OpenClaw.app)を保持することで、ビルド間で許可が保持され、VibeTunnel アプローチと一致します。