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、debug/releaseチャネルを表示可能に。
  • パッケージングはデフォルトでNode 24:スクリプトはTSビルドとControl UIビルドを実行。互換性のためNode 22 LTS(現在22.16+)も引き続きサポート。
  • 環境変数から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   # dev専用の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アプローチと同様にビルド間で付与が保持されます。