imessage-Plugin erreicht jetzt dieselbe private API-Oberfläche wie BlueBubbles (react, edit, unsend, reply, sendWithEffect, Gruppenverwaltung, Anhänge), indem es steipete/imsg über JSON-RPC steuert. Wenn Sie bereits einen Mac mit installiertem imsg betreiben, können Sie den BlueBubbles-Server entfernen und das Plugin direkt mit Messages.app kommunizieren lassen.
Die BlueBubbles-Unterstützung wurde entfernt. OpenClaw unterstützt iMessage nur über imsg. Diese Anleitung dient der Migration alter channels.bluebubbles-Konfigurationen zu channels.imessage; es gibt keinen anderen unterstützten Migrationspfad.
Die kurze Ankündigung und Betreiberzusammenfassung finden Sie unter Entfernung von BlueBubbles und der imsg-iMessage-Pfad.
Migrations-Checkliste
Verwenden Sie diese Checkliste, wenn Sie Ihre alte BlueBubbles-Konfiguration bereits kennen und den kürzesten sicheren Weg möchten:- Prüfen Sie
imsgdirekt auf dem Mac, auf dem Messages.app ausgeführt wird (imsg chats,imsg history,imsg sendundimsg rpc --help). - Kopieren Sie Verhaltensschlüssel von
channels.bluebubblesnachchannels.imessage:dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,includeAttachments,attachmentRoots,mediaMaxMb,textChunkLimit,coalesceSameSenderDmsundactions. - Entfernen Sie Transportschlüssel, die nicht mehr existieren:
serverUrl,password, Webhook-URLs und die BlueBubbles-Servereinrichtung. - Wenn der Gateway nicht auf dem Messages-Mac läuft, setzen Sie
channels.imessage.cliPathauf einen SSH-Wrapper und legen SieremoteHostfür entfernte Anhangsabrufe fest. - Aktivieren Sie bei gestopptem Gateway
channels.imessageund führen Sie dannopenclaw channels status --probe --channel imessageaus. - Testen Sie eine DM, eine zugelassene Gruppe, Anhänge, sofern aktiviert, und jede private API-Aktion, die der Agent voraussichtlich verwenden soll.
- Löschen Sie den BlueBubbles-Server und die alte
channels.bluebubbles-Konfiguration, nachdem der iMessage-Pfad verifiziert wurde.
Wann diese Migration sinnvoll ist
- Sie betreiben
imsgbereits auf demselben Mac (oder auf einem per SSH erreichbaren Mac), auf dem Messages.app angemeldet ist. - Sie möchten eine Komponente weniger betreiben: keinen separaten BlueBubbles-Server, keinen zu authentifizierenden REST-Endpunkt, keine Webhook-Verkabelung. Eine einzelne CLI-Binärdatei statt Server + Client-App + Hilfsprogramm.
- Sie verwenden einen unterstützten macOS-/
imsg-Build, bei dem der private API-Probeavailable: truemeldet.
Was imsg tut
imsg ist eine lokale macOS-CLI für Messages. OpenClaw startet imsg rpc als untergeordneten Prozess und kommuniziert per JSON-RPC über stdin/stdout. Es gibt keinen HTTP-Server, keine Webhook-URL, keinen Hintergrund-Daemon, keinen Launch-Agent und keinen Port, der offengelegt werden muss.
- Lesezugriffe erfolgen aus
~/Library/Messages/chat.dbüber ein schreibgeschütztes SQLite-Handle. - Live eingehende Nachrichten kommen aus
imsg watch/watch.subscribe, daschat.db-Dateisystemereignissen mit einem Polling-Fallback folgt. - Sendevorgänge verwenden Messages.app-Automatisierung für normale Text- und Dateisendungen.
- Erweiterte Aktionen verwenden
imsg launch, um denimsg-Helfer in Messages.app einzuschleusen. Das schaltet Lesebestätigungen, Tippindikatoren, Rich Sends, Bearbeiten, Zurückrufen, Antworten in Threads, Tapbacks und Gruppenverwaltung frei. - Linux-Builds können eine kopierte
chat.dbuntersuchen, aber nicht senden, die Live-Mac-Datenbank beobachten oder Messages.app steuern. Führen Sie für OpenClaw iMessageimsgauf dem angemeldeten Mac oder über einen SSH-Wrapper zu diesem Mac aus.
Bevor Sie beginnen
-
Installieren Sie
imsgauf dem Mac, auf dem Messages.app ausgeführt wird:Wennimsg chatsmitunable to open database file, leerer Ausgabe oderauthorization deniedfehlschlägt, gewähren Sie dem Terminal, Editor, Node-Prozess, Gateway-Dienst oder SSH-Elternprozess, derimsgstartet, Festplattenvollzugriff und öffnen Sie diesen Elternprozess anschließend erneut. -
Prüfen Sie die Lese-, Watch-, Sende- und RPC-Oberflächen, bevor Sie die OpenClaw-Konfiguration ändern:
Ersetzen Sie
42durch eine echte Chat-ID ausimsg chats. Senden erfordert eine Automation-Berechtigung für Messages.app. Wenn OpenClaw über SSH ausgeführt wird, führen Sie diese Befehle über denselben SSH-Wrapper oder Benutzerkontext aus, den OpenClaw verwenden wird. Wenn Lesezugriffe/Probes funktionieren, Sendevorgänge aber mit AppleEvents-1743fehlschlagen, prüfen Sie, ob Automation auf/usr/libexec/sshd-keygen-wrappergelandet ist; siehe SSH-Wrapper-Sendevorgänge schlagen mit AppleEvents -1743 fehl. -
Aktivieren Sie die private API-Brücke, wenn Sie erweiterte Aktionen benötigen:
imsg launcherfordert, dass SIP deaktiviert ist. Einfaches Senden, Verlauf und Watch funktionieren ohneimsg launch; erweiterte Aktionen nicht. -
Nachdem Sie eine aktivierte
channels.imessage-Konfiguration hinzugefügt haben, verifizieren Sie die Brücke über OpenClaw:Sie möchtenimessage.privateApi.available: true. Wennfalsegemeldet wird, beheben Sie das zuerst; siehe Capability-Erkennung.channels status --probeprüft nur konfigurierte, aktivierte Konten. -
Erstellen Sie einen Snapshot Ihrer Konfiguration:
Konfigurationsübersetzung
iMessage und BlueBubbles teilen viele Konfigurationen auf Kanalebene. Die Schlüssel, die sich ändern, betreffen meist den Transport (REST-Server statt lokaler CLI). Verhaltensschlüssel (dmPolicy, groupPolicy, allowFrom usw.) behalten dieselbe Bedeutung.
| BlueBubbles | gebündeltes iMessage | Hinweise |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | Gleiche Semantik. |
channels.bluebubbles.serverUrl | (entfernt) | Kein REST-Server — das Plugin startet imsg rpc über stdio. |
channels.bluebubbles.password | (entfernt) | Keine Webhook-Authentifizierung erforderlich. |
| (implizit) | channels.imessage.cliPath | Pfad zu imsg (Standard imsg); verwenden Sie ein Wrapper-Skript für SSH. |
| (implizit) | channels.imessage.dbPath | Optionale Überschreibung für die Messages.app-chat.db; wird automatisch erkannt, wenn weggelassen. |
| (implizit) | channels.imessage.remoteHost | host oder user@host — nur erforderlich, wenn cliPath ein SSH-Wrapper ist und Sie SCP-Abrufe von Anhängen wünschen. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | Gleiche Werte (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | Pairing-Freigaben werden nach Handle übernommen, nicht nach Token. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | Gleiche Werte (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | Gleich. |
channels.bluebubbles.groups | channels.imessage.groups | Kopieren Sie dies unverändert, einschließlich eines etwaigen groups: { "*": { ... } }-Wildcard-Eintrags. Pro Gruppe werden requireMention, tools, toolsBySender übernommen. Mit groupPolicy: "allowlist" verwirft ein leerer oder fehlender groups-Block stillschweigend jede Gruppennachricht — siehe „Stolperfalle Gruppenregistrierung“ unten. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | Standard true. Beim gebündelten Plugin wird dies nur ausgelöst, wenn die private API-Prüfung aktiv ist. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | Gleiche Form, ebenfalls standardmäßig deaktiviert. Wenn bei Ihnen Anhänge über BlueBubbles liefen, müssen Sie dies im iMessage-Block ausdrücklich erneut setzen — es wird nicht implizit übernommen, und eingehende Fotos/Medien werden stillschweigend verworfen, ohne Inbound message-Logzeile, bis Sie dies tun. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | Lokale Roots; gleiche Wildcard-Regeln. |
| (N/V) | channels.imessage.remoteAttachmentRoots | Wird nur verwendet, wenn remoteHost für SCP-Abrufe gesetzt ist. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | Standard 16 MB bei iMessage (BlueBubbles-Standard war 8 MB). Setzen Sie dies explizit, wenn Sie die niedrigere Obergrenze beibehalten möchten. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | Standard 4000 bei beiden. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | Gleiche Opt-in-Funktion. Nur DMs — Gruppenchats behalten bei beiden Kanälen den sofortigen Versand pro Nachricht. Erweitert den standardmäßigen eingehenden Debounce auf 7000 ms, wenn aktiviert und kein explizites messages.inbound.byChannel.imessage oder globales messages.inbound.debounceMs gesetzt ist. Siehe iMessage-Dokumentation § Zusammenführen aufgeteilter DMs. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (N/V) | iMessage liest Anzeigenamen von Absendern bereits aus chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | Umschalter pro Aktion: reactions, edit, unsend, reply, sendWithEffect, renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, sendAttachment. |
channels.bluebubbles.accounts.*) werden eins zu eins in channels.imessage.accounts.* übersetzt.
Stolperfalle Gruppenregistrierung
Das gebündelte iMessage-Plugin führt zwei separate Allowlist-Gates für Gruppen direkt nacheinander aus. Beide müssen erfolgreich sein, damit eine Gruppennachricht den Agenten erreicht:- Allowlist für Absender / Chat-Ziel (
channels.imessage.groupAllowFrom) — geprüft durchisAllowedIMessageSender. Gleicht eingehende Nachrichten nach Absender-Handle,chat_guid,chat_identifieroderchat_idab. Gleiche Form wie bei BlueBubbles. - Gruppenregistrierung (
channels.imessage.groups) — geprüft durchresolveChannelGroupPolicyausinbound-processing.ts:199. MitgroupPolicy: "allowlist"erfordert dieses Gate entweder:- einen
groups: { "*": { ... } }-Wildcard-Eintrag (setztallowAll = true) oder - einen expliziten Eintrag pro
chat_iduntergroups.
- einen
warn-Ebene aus, sodass dies auf der Standard-Logebene nicht mehr still geschieht:
- Ein einmaliger
warnbeim Start pro Konto, wenngroupPolicy: "allowlist"gesetzt ist,channels.imessage.groupsaber leer ist (kein"*"-Wildcard, keine Einträge prochat_id) — ausgelöst, bevor Nachrichten eintreffen. - Ein einmaliger
warnprochat_id, wenn eine bestimmte Gruppe zur Laufzeit zum ersten Mal verworfen wird, mit Nennung der chat_id und des genauen Schlüssels, der zugroupshinzugefügt werden muss, um sie zu erlauben.
groupAllowFrom und groupPolicy, überspringen aber den groups-Block, weil BlueBubbles’ groups: { "*": { "requireMention": true } } wie eine nicht zusammenhängende Erwähnungseinstellung aussieht. Tatsächlich ist er für das Registry-Gate entscheidend.
Die Mindestkonfiguration, damit Gruppennachrichten nach groupPolicy: "allowlist" weiter fließen:
requireMention: true unter * ist harmlos, wenn keine Erwähnungsmuster konfiguriert sind: Die Runtime setzt canDetectMention = false und umgeht den Erwähnungs-Drop bei inbound-processing.ts:512. Mit konfigurierten Erwähnungsmustern (agents.list[].groupChat.mentionPatterns) funktioniert es wie erwartet.
Wenn die Gateway-Logs imessage: dropping group message from chat_id=<id> oder die Startzeile imessage: groupPolicy="allowlist" but channels.imessage.groups is empty enthalten, verwirft Gate 2 die Nachricht - fügen Sie den groups-Block hinzu.
Schritt für Schritt
-
Fügen Sie einen iMessage-Block neben dem vorhandenen BlueBubbles-Block hinzu. Lassen Sie ihn deaktiviert, solange der Gateway noch BlueBubbles-Traffic routet:
-
Prüfen Sie, bevor Traffic relevant wird - stoppen Sie den Gateway, aktivieren Sie den iMessage-Block vorübergehend und bestätigen Sie über die CLI, dass iMessage fehlerfrei gemeldet wird:
channels status --probeprüft nur konfigurierte, aktivierte Konten. Starten Sie den Gateway nicht mit gleichzeitig aktiviertem BlueBubbles und iMessage neu, außer Sie möchten bewusst beide Kanal-Monitore ausführen. Wenn Sie nicht sofort umstellen, setzen Siechannels.imessage.enabledvor dem Neustart des Gateway wieder auffalse. Verwenden Sie die direktenimsg-Befehle in Bevor Sie beginnen, um den Mac zu validieren, bevor Sie OpenClaw-Traffic aktivieren. -
Stellen Sie um. Sobald das aktivierte iMessage-Konto fehlerfrei gemeldet wird, entfernen Sie die BlueBubbles-Konfiguration und lassen Sie iMessage aktiviert:
Starten Sie den Gateway neu. Eingehender iMessage-Traffic läuft jetzt durch das gebündelte Plugin.
- DMs verifizieren. Senden Sie dem Agent eine Direktnachricht und bestätigen Sie, dass die Antwort ankommt.
-
Gruppen separat verifizieren. DMs und Gruppen nehmen unterschiedliche Codepfade - ein DM-Erfolg beweist nicht, dass Gruppen geroutet werden. Senden Sie dem Agent eine Nachricht in einem gekoppelten Gruppenchat und bestätigen Sie, dass die Antwort ankommt. Wenn die Gruppe still bleibt (keine Agent-Antwort, kein Fehler), prüfen Sie das Gateway-Log auf
imessage: dropping group message from chat_id=<id>oder die Startzeileimessage: groupPolicy="allowlist" but channels.imessage.groups is empty- beide erscheinen beim Standard-Log-Level. Wenn eine davon erscheint, fehlt Ihrgroups-Block oder ist leer - siehe „Group registry footgun“ oben. -
Aktionsoberfläche verifizieren - bitten Sie den Agent aus einer gekoppelten DM heraus, zu reagieren, zu bearbeiten, zurückzuziehen, zu antworten, ein Foto zu senden und (in einer Gruppe) die Gruppe umzubenennen / einen Teilnehmer hinzuzufügen oder zu entfernen. Jede Aktion sollte nativ in Messages.app ankommen. Wenn eine davon „iMessage
<action>requires the imsg private API bridge“ ausgibt, führen Sie erneutimsg launchaus und aktualisieren Siechannels status --probe. -
Entfernen Sie den BlueBubbles-Server und die Konfiguration, sobald iMessage-DMs, Gruppen und Aktionen verifiziert sind. OpenClaw verwendet
channels.bluebubblesnicht.
Aktionsparität auf einen Blick
| Aktion | Legacy BlueBubbles | gebündeltes iMessage |
|---|---|---|
| Text senden / SMS-Fallback | ✅ | ✅ |
| Medien senden (Foto, Video, Datei, Sprachnachricht) | ✅ | ✅ |
Thread-Antwort (reply_to_guid) | ✅ | ✅ (schließt #51892) |
Tapback (react) | ✅ | ✅ |
| Bearbeiten / zurückziehen (macOS 13+-Empfänger) | ✅ | ✅ |
| Mit Bildschirmeffekt senden | ✅ | ✅ (schließt Teil von #9394) |
| Rich-Text fett / kursiv / unterstrichen / durchgestrichen | ✅ | ✅ (Typed-Run-Formatierung über attributedBody) |
| Gruppe umbenennen / Gruppensymbol setzen | ✅ | ✅ |
| Teilnehmer hinzufügen / entfernen, Gruppe verlassen | ✅ | ✅ |
| Lesebestätigungen und Tippindikator | ✅ | ✅ (durch private API-Probe abgesichert) |
| DM-Zusammenführung bei gleichem Absender | ✅ | ✅ (nur DM; opt-in über channels.imessage.coalesceSameSenderDms) |
| Eingehende Wiederherstellung nach einem Neustart | ✅ (Webhook-Replay + History-Fetch) | ✅ (automatisch: verpasste Nachrichten über since_rowid + Deduplizierung wiedergeben; größeres Fenster lokal) |
imsg watch.subscribe since_rowid wieder ein und dedupliziert nach GUID, während eine Altersgrenze für veraltete Backlogs die Push-Flush-„Backlog-Bombe“ unterdrückt. Dies läuft über die imsg-RPC-Verbindung und funktioniert daher auch für Remote-SSH-Setups mit cliPath; lokale Setups erhalten ein größeres Wiederherstellungsfenster, weil sie chat.db lesen können. Siehe Eingehende Wiederherstellung nach einem Bridge- oder Gateway-Neustart.
Pairing, Sitzungen und ACP-Bindings
- Pairing-Genehmigungen werden per Handle übernommen. Sie müssen bekannte Absender nicht erneut genehmigen -
channels.imessage.allowFromerkennt dieselben+15555550123- /user@example.com-Strings, die BlueBubbles verwendet hat. - Sitzungen bleiben pro Agent + Chat begrenzt. DMs werden unter dem Standard
session.dmScope=mainin die Hauptsitzung des Agent zusammengeführt; Gruppensitzungen bleiben prochat_idisoliert. Die Sitzungsschlüssel unterscheiden sich (agent:<id>:imessage:group:<chat_id>gegenüber dem BlueBubbles-Äquivalent) - alte Konversationshistorie unter BlueBubbles-Sitzungsschlüsseln wird nicht in iMessage-Sitzungen übernommen. - ACP-Bindings, die auf
match.channel: "bluebubbles"verweisen, müssen auf"imessage"aktualisiert werden. Die Formen vonmatch.peer.id(chat_id:,chat_guid:,chat_identifier:, bloßes Handle) sind identisch.
Kein Rollback-Kanal
Es gibt keine unterstützte BlueBubbles-Runtime, zu der Sie zurückwechseln können. Wenn die iMessage-Verifizierung fehlschlägt, setzen Siechannels.imessage.enabled: false, starten Sie den Gateway neu, beheben Sie den imsg-Blocker und versuchen Sie die Umstellung erneut.
Der Antwort-Cache liegt im SQLite-Plugin-Status. openclaw doctor --fix importiert und archiviert die alte imessage/reply-cache.jsonl-Sidecar-Datei, wenn sie vorhanden ist.
Verwandte Themen
- BlueBubbles-Entfernung und der imsg-iMessage-Pfad - kurze Ankündigung und Betreiberzusammenfassung.
- iMessage - vollständige iMessage-Kanalreferenz, einschließlich Einrichtung mit
imsg launchund Fähigkeitserkennung. /channels/bluebubbles- Legacy-URL, die zu diesem Migrationsleitfaden weiterleitet.- Pairing - DM-Authentifizierung und Pairing-Ablauf.
- Kanalrouting - wie der Gateway einen Kanal für ausgehende Antworten auswählt.