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