Zum Inhalt springen

OpenClaw für macOS signieren: Debug-Builds in 5 Minuten

Kennst du das? Du baust deine Mac-App neu und plötzlich fragt macOS wieder nach allen Berechtigungen. Benachrichtigungen, Mikrofon oder Screen Recording – alles weg. Das nervt im Entwicklungsalltag gewaltig und hält dich nur auf.

Diese App wird normalerweise über scripts/package-mac-app.sh gebaut. Das Script erledigt jetzt folgende Aufgaben für dich:

  • Es setzt eine stabile Debug Bundle Identifier: ai.openclaw.mac.debug.
  • Es schreibt die Info.plist mit dieser Bundle ID (überschreibbar via BUNDLE_ID=...).
  • Es ruft scripts/codesign-mac-app.sh auf, um das Main Binary und das App Bundle zu signieren. So erkennt macOS jeden Rebuild als dasselbe signierte Bundle an und behält die TCC-Berechtigungen (Notifications, Accessibility, Screen Recording, Mic, Speech). Für stabile Berechtigungen solltest du eine echte Signing Identity nutzen; Ad-hoc ist optional und fehleranfällig (siehe macOS permissions).
  • Standardmäßig wird CODESIGN_TIMESTAMP=auto verwendet, was vertrauenswürdige Zeitstempel für Developer ID Signaturen aktiviert. Mit CODESIGN_TIMESTAMP=off kannst du das Zeitstempeln überspringen (praktisch für Offline-Debug-Builds).
  • Build-Metadaten werden in die Info.plist injiziert: OpenClawBuildTimestamp (UTC) und OpenClawGitCommit (Short Hash). So zeigt das “Über”-Fenster den Build, Git-Infos und den Debug/Release-Channel an.
  • Packaging nutzt standardmäßig Node 24: Das Script führt TS-Builds und den Control UI Build aus. Node 22 LTS (aktuell 22.14+) wird weiterhin unterstützt.
  • SIGN_IDENTITY wird aus der Umgebung gelesen. Füge export SIGN_IDENTITY="Apple Development: Dein Name (TEAMID)" (oder dein Developer ID Application Zertifikat) zu deiner Shell-Konfiguration hinzu, um immer mit deinem Zertifikat zu signieren. Ad-hoc-Signierung erfordert ein explizites Opt-in via ALLOW_ADHOC_SIGNING=1 oder SIGN_IDENTITY="-" (nicht empfohlen für das Testen von Berechtigungen).
  • Nach dem Signieren läuft ein Team ID Audit. Das Script bricht ab, falls ein Mach-O innerhalb des App Bundles mit einer anderen Team ID signiert ist. Mit SKIP_TEAM_ID_CHECK=1 kannst du das umgehen.
Terminal-Fenster
# from repo root
scripts/package-mac-app.sh # auto-selects identity; errors if none found
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh # real cert
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh # ad-hoc (permissions will not stick)
SIGN_IDENTITY="-" scripts/package-mac-app.sh # explicit ad-hoc (same caveat)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh # dev-only Sparkle Team ID mismatch workaround

Wenn du mit SIGN_IDENTITY="-" (ad-hoc) signierst, deaktiviert das Script automatisch die Hardened Runtime (--options runtime). Das ist nötig, um Abstürze zu verhindern, wenn die App versucht, eingebettete Frameworks (wie Sparkle) zu laden, die nicht dieselbe Team ID teilen. Ad-hoc-Signaturen führen auch dazu, dass TCC-Berechtigungen nicht dauerhaft gespeichert werden; schau dir die macOS permissions an, um zu erfahren, wie du das behebst.

package-mac-app.sh versieht das Bundle mit folgenden Infos:

  • OpenClawBuildTimestamp: ISO8601 UTC zum Zeitpunkt des Packens
  • OpenClawGitCommit: Kurzer Git-Hash (oder unknown, falls nicht verfügbar)

Der “Über”-Tab liest diese Keys aus, um Version, Build-Datum, Git-Commit und den Status als Debug-Build (via #if DEBUG) anzuzeigen. Starte den Packager neu, um diese Werte nach Code-Änderungen zu aktualisieren.

TCC-Berechtigungen hängen an der Bundle Identifier und der Code-Signatur. Unsignierte Debug-Builds mit wechselnden UUIDs haben dazu geführt, dass macOS die Freigaben nach jedem Rebuild vergessen hat. Indem wir die Binaries signieren (standardmäßig ad-hoc) und eine feste Bundle ID sowie einen festen Pfad (dist/OpenClaw.app) beibehalten, bleiben die Freigaben zwischen den Builds erhalten. Das entspricht dem VibeTunnel-Ansatz.

AI Setup Assistant

OpenClaw

OpenClaw Expert

Noch festgefahren?

Wenn diese Seite nicht hilft, frage OpenClaw Expert nach Schritt-fuer-Schritt-Loesungen.