Mac-Signierung (Debug-Builds)

Diese App wird üblicherweise aus scripts/package-mac-app.sh gebaut, das jetzt:

  • eine stabile Debug-Bundle-ID setzt: ai.openclaw.mac.debug
  • die Info.plist mit dieser Bundle-ID schreibt (Override via BUNDLE_ID=...)
  • scripts/codesign-mac-app.sh aufruft, um die Main-Binary und das App-Bundle zu signieren, damit macOS jeden Rebuild als dasselbe signierte Bundle behandelt und TCC-Berechtigungen behält (Benachrichtigungen, Bedienungshilfen, Bildschirmaufnahme, Mikrofon, Spracherkennung). Für stabile Berechtigungen verwende eine echte Signierungsidentität; Ad-hoc ist Opt-in und fragil (siehe macOS-Berechtigungen).
  • standardmäßig CODESIGN_TIMESTAMP=auto verwendet; das aktiviert vertrauenswürdige Zeitstempel für Developer-ID-Signaturen. Setze CODESIGN_TIMESTAMP=off, um Timestamping zu überspringen (Offline-Debug-Builds).
  • Build-Metadaten in Info.plist injiziert: OpenClawBuildTimestamp (UTC) und OpenClawGitCommit (kurzer Hash), damit der About-Bereich Build, Git und Debug/Release-Channel anzeigen kann.
  • Paketierung standardmäßig mit Node 24: Das Skript führt TS-Builds und den Control-UI-Build aus. Node 22 LTS, aktuell 22.16+, wird weiterhin zur Kompatibilität unterstützt.
  • SIGN_IDENTITY aus der Umgebung liest. Füge export SIGN_IDENTITY="Apple Development: Dein Name (TEAMID)" (oder dein Developer ID Application-Zertifikat) zu deiner Shell-RC hinzu, um immer mit deinem Zertifikat zu signieren. Ad-hoc-Signierung erfordert explizites Opt-in via ALLOW_ADHOC_SIGNING=1 oder SIGN_IDENTITY="-" (nicht empfohlen für Berechtigungstests).
  • nach der Signierung ein Team-ID-Audit durchführt und fehlschlägt, wenn ein Mach-O innerhalb des App-Bundles von einer anderen Team-ID signiert ist. Setze SKIP_TEAM_ID_CHECK=1 zum Überspringen.

Verwendung

# vom Repo-Root
scripts/package-mac-app.sh               # wählt Identität automatisch; Fehler wenn keine gefunden
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh   # echtes Zert.
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh    # ad-hoc (Berechtigungen bleiben nicht)
SIGN_IDENTITY="-" scripts/package-mac-app.sh        # explizit ad-hoc (gleicher Vorbehalt)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh   # dev-only Sparkle Team-ID-Mismatch-Workaround

Hinweis zu Ad-hoc-Signierung

Beim Signieren mit SIGN_IDENTITY="-" (ad-hoc) deaktiviert das Skript automatisch die Hardened Runtime (--options runtime). Das ist notwendig, um Abstürze zu verhindern, wenn die App versucht, eingebettete Frameworks (wie Sparkle) zu laden, die nicht dieselbe Team-ID haben. Ad-hoc-Signaturen brechen auch die TCC-Berechtigungspersistenz; siehe macOS-Berechtigungen für Wiederherstellungsschritte.

Build-Metadaten für About

package-mac-app.sh stempelt das Bundle mit:

  • OpenClawBuildTimestamp: ISO8601 UTC zum Paketierungszeitpunkt
  • OpenClawGitCommit: kurzer Git-Hash (oder unknown falls nicht verfügbar)

Der About-Tab liest diese Keys, um Version, Build-Datum, Git-Commit und ob es ein Debug-Build ist (via #if DEBUG) anzuzeigen. Führe den Paketierungsprozess aus, um diese Werte nach Code-Änderungen zu aktualisieren.

Warum

TCC-Berechtigungen sind an die Bundle-ID und die Code-Signatur gebunden. Unsignierte Debug-Builds mit wechselnden UUIDs führten dazu, dass macOS Zusagen nach jedem Rebuild vergaß. Das Signieren der Binaries (standardmäßig ad-hoc) und das Beibehalten einer festen Bundle-ID/Pfad (dist/OpenClaw.app) bewahrt die Zusagen zwischen Builds, analog zum VibeTunnel-Ansatz.