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.shaufruft, 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=autoverwendet; das aktiviert vertrauenswürdige Zeitstempel für Developer-ID-Signaturen. SetzeCODESIGN_TIMESTAMP=off, um Timestamping zu überspringen (Offline-Debug-Builds). - Build-Metadaten in Info.plist injiziert:
OpenClawBuildTimestamp(UTC) undOpenClawGitCommit(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_IDENTITYaus der Umgebung liest. Fügeexport 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 viaALLOW_ADHOC_SIGNING=1oderSIGN_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=1zum Ü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 PaketierungszeitpunktOpenClawGitCommit: kurzer Git-Hash (oderunknownfalls 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.