Native Werbebotschaften

Mithilfe von Erweiterungen und Apps können Nachrichten mit nativen Anwendungen über eine API ausgetauscht werden, die der folgenden ähnelt: den anderen APIs für die Nachrichtenweitergabe. Native Anwendungen, die diese Funktion unterstützen, müssen eine nativen Messaging-Host, der mit der Erweiterung kommunizieren kann. Chrome startet den Host in einen separaten Prozess erstellt und über Standardein- und -ausgabestreams mit ihm kommuniziert.

Host für natives Messaging

Um einen Host für natives Messaging zu registrieren, muss die Anwendung eine Manifestdatei installieren, die definiert die Konfiguration des Hosts für natives Messaging. Hier ist ein Beispiel für die Manifestdatei:

{
  "name": "com.my_company.my_application",
  "description": "My Application",
  "path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

Die Manifestdatei des nativen Messaging-Hosts muss ein gültiges JSON-Format haben und die folgenden Felder enthalten:

NameBeschreibung
nameName des Hosts für natives Messaging. Clients übergeben diesen String an runtime.connectNative oder runtime.sendNativeMessage. Dieser Name darf nur kleingeschriebene alphanumerische Zeichen, Unterstriche und Punkte enthalten. Der Name darf nicht mit einem Punkt beginnen oder enden. Auf einen Punkt darf kein weiterer Punkt folgen.
descriptionKurze Anwendungsbeschreibung.
pathPfad zur Binärdatei des Hosts für natives Messaging. Unter Linux und OSX muss der Pfad absolut sein. Unter Windows kann sie sich auf das Verzeichnis beziehen, in dem sich die Manifestdatei befindet. Der Hostprozess wird gestartet, wobei das aktuelle Verzeichnis auf das Verzeichnis festgelegt ist, das die Hostbinärdatei enthält. Wenn dieser Parameter beispielsweise auf C:\Application\nm_host.exe gesetzt ist, wird er mit dem aktuellen Verzeichnis C:\Application\ gestartet.
typeTyp der Schnittstelle, die für die Kommunikation mit dem Host für natives Messaging verwendet wird. Derzeit gibt es nur einen möglichen Wert für diesen Parameter: stdio. Es gibt an, dass Chrome stdin und stdout verwenden soll, um mit dem Host zu kommunizieren.
allowed_originsListe der Erweiterungen, die Zugriff auf den Host für natives Messaging haben sollen. Platzhalter wie chrome-extension://*/* sind nicht zulässig.

Hoststandort für natives Messaging

Der Speicherort der Manifestdatei hängt von der Plattform ab.

Unter Windows kann die Manifestdatei an einer beliebigen Stelle im Dateisystem gespeichert werden. Die Anwendung Installationsprogramm muss Registrierungsschlüssel erstellen HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ oder HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ und Standardwert dieses Schlüssels auf den vollständigen Pfad zur Manifestdatei festlegen. Wenn Sie beispielsweise folgenden Befehl:

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application" /ve /t REG_SZ /d "C:\path\to\nmh-manifest.json" /f

oder die folgende .reg-Datei verwenden:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.my_company.my_application]
@="C:\\path\\to\\nmh-manifest.json"

Wenn Chrome nach Hosts für natives Messaging sucht, wird zuerst die 32-Bit-Registrierung abgefragt, dann die 64-Bit- Registry.

Unter OS X und Linux variiert der Speicherort der Manifestdatei des nativen Messaging-Hosts je nach Browser (Google Chrome oder Chromium) installiert sein. Die systemweiten Hosts für natives Messaging werden zu einem und die Hosts für natives Messaging auf Nutzerebene werden in einem Unterverzeichnis im Nutzerprofilverzeichnis mit dem Namen NativeMessagingHosts.

  • OS X (systemweit) <ph type="x-smartling-placeholder">
      </ph>
    • Google Chrome: /Library/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • Chromium: /Library/Application Support/Chromium/NativeMessagingHosts/_com.my_company.my_application_.json
  • OS X (nutzerspezifisch, Standardpfad) <ph type="x-smartling-placeholder">
      </ph>
    • Google Chrome: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • Chromium: ~/Library/Application Support/Chromium/NativeMessagingHosts/_com.my_company.my_application_.json
  • Linux (systemweit) <ph type="x-smartling-placeholder">
      </ph>
    • Google Chrome: /etc/opt/chrome/native-messaging-hosts/_com.my_company.my_application_.json
    • Chromium: /etc/chromium/native-messaging-hosts/_com.my_company.my_application_.json
  • Linux (nutzerspezifisch, default-Pfad) <ph type="x-smartling-placeholder">
      </ph>
    • Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • Chromium: ~/.config/chromium/NativeMessagingHosts/_com.my_company.my_application_.json

Protokoll für natives Messaging

Chrome startet jeden Host für natives Messaging in einem separaten Prozess und kommuniziert mit ihm über Standardeingabe (stdin) und Standardausgabe (stdout). Das gleiche Format wird zum Senden von Nachrichten in in beide Richtungen: Jede Nachricht wird mit JSON serialisiert, UTF-8-codiert und mit vorangestelltem 32-Bit-Zeichen Nachrichtenlänge in nativer Byte-Reihenfolge. Die maximale Größe einer einzelnen Nachricht aus der nativen Benachrichtigung 1 MB groß. Dies dient hauptsächlich dazu, Chrome vor fehlerhaften nativen Anwendungen zu schützen. Die maximale Größe der Nachricht, die an den nativen Messaging-Host gesendet wird, ist 4 GB groß.

Das erste Argument für den Host für natives Messaging ist der Ursprung des Aufrufers. chrome-extension://[ID of allowed extension] So können Hosts für natives Messaging Quelle der Nachricht, wenn mehrere Erweiterungen im Schlüssel allowed_origins im Manifest des nativen Messaging-Hosts. Warnung: In Windows, in Chrome 54 und früheren Versionen wurde der Ursprung als zweiter Parameter übergeben. anstelle des ersten Parameters.

Wenn mit runtime.connectNative ein Messaging-Port erstellt wird, startet Chrome das native Messaging ausgeführt werden, bis der Port gelöscht wird. Wenn eine Nachricht hingegen Wenn diese mit runtime.sendNativeMessage gesendet werden, ohne einen Messaging-Port zu erstellen, startet Chrome eine neue Hostprozess für natives Messaging für jede Nachricht. In diesem Fall ist die erste vom Host als Antwort auf die ursprüngliche Anfrage behandelt, d.h. Chrome übergibt sie an die Antwort Callback, der beim Aufruf von runtime.sendNativeMessage angegeben wird. Alle anderen Nachrichten, die von generiert wurden werden in diesem Fall ignoriert.

Unter Windows wird dem Host für natives Messaging auch ein Befehlszeilenargument mit einem Handle übergeben. Natives Chrome-Fenster wird aufgerufen: --parent-window=<decimal handle value>. So können die nativen Anzeigen Messaging-Host native UI-Fenster erstellen, denen die richtigen übergeordneten Elemente zugewiesen sind. Beachten Sie, dass dieser Wert 0, wenn der aufrufende Kontext eine Hintergrundskriptseite ist.

Verbindung zu einer nativen Anwendung herstellen

Das Senden und Empfangen von Nachrichten an und von einer nativen Anwendung ähnelt sehr dem erweiterungsübergreifenden Messaging. Der Hauptunterschied besteht darin, dass runtime.connectNative verwendet wird runtime.connect und runtime.sendNativeMessage werden anstelle von runtime.sendMessage. Diese Methoden können nur verwendet werden, wenn die Methode "nativeMessaging" im Feld deklarieren, Manifestdatei.

Im folgenden Beispiel wird das Objekt runtime.Port erstellt, das mit dem Host für natives Messaging verbunden ist. com.my_company.my_application beginnt, Nachrichten von diesem Port zu überwachen, und sendet einen ausgehenden Nachricht:

var port = chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener(function(msg) {
  console.log("Received" + msg);
});
port.onDisconnect.addListener(function() {
  console.log("Disconnected");
});
port.postMessage({ text: "Hello, my_application" });

Mit runtime.sendNativeMessage kann eine Nachricht an eine native Anwendung gesendet werden, ohne Port, z.B.:

chrome.runtime.sendNativeMessage('com.my_company.my_application',
  { text: "Hello" },
  function(response) {
    console.log("Received " + response);
  });

Fehlerbehebung bei nativem Messaging

Wenn der Host für natives Messaging nicht gestartet werden kann, wird in stderr geschrieben oder wenn ein Verstoß gegen die Kommunikationsprotokolls, wird die Ausgabe in das Fehlerprotokoll von Chrome geschrieben. Unter Linux und OS X enthält dieses Protokoll können Sie ganz einfach darauf zugreifen, indem Sie Chrome über die Befehlszeile starten und sich die Ausgabe im . Verwenden Sie unter Windows --enable-logging, wie unter Logging aktivieren erläutert.

Im Folgenden finden Sie einige Fehler und Tipps zur Lösung dieser Probleme:

  • Host für natives Messaging konnte nicht gestartet werden.
    • Prüfen Sie, ob Sie ausreichende Berechtigungen zum Ausführen der Datei haben.
  • Der angegebene Hostname für natives Messaging ist ungültig.
    • Prüfen Sie, ob der Name ungültige Zeichen enthält. Nur alphanumerische Zeichen in Kleinschreibung, Unterstriche und Punkte sind zulässig. Ein Name darf nicht mit einem Punkt beginnen oder enden. gefolgt von einem weiteren Punkt.
  • Der native Host wurde verlassen.
    • Die Verbindung zum Host für natives Messaging wurde unterbrochen, bevor die Nachricht von Chrome gelesen wurde. Das ist die meiste wahrscheinlich von Ihrem Host für natives Messaging initiiert.
  • Der angegebene Host für natives Messaging wurde nicht gefunden.
    • Ist der Name in der Erweiterung und in der Manifestdatei richtig geschrieben?
    • Befindet sich das Manifest im richtigen Verzeichnis und unter dem richtigen Namen? Siehe Host für natives Messaging Speicherort für die erwarteten Formate.
    • Hat die Manifestdatei das richtige Format? Ist insbesondere die JSON-Syntax korrekt? -Werte der Definition eines Manifests des nativen Messaging-Hosts entsprechen?
    • Ist die in path angegebene Datei vorhanden? Unter Windows können die Pfade relativ sein, aber unter OS X und Linux müssen die Pfade absolut sein.
  • Der Hostname des Hosts für natives Messaging ist nicht registriert. (nur Windows) <ph type="x-smartling-placeholder">
      </ph>
    • Der Host für natives Messaging wurde in der Windows-Registrierung nicht gefunden. Mit regedit überprüfen Gibt an, ob der Schlüssel wirklich erstellt wurde und dem erforderlichen Format entspricht, wie unter native Anzeigen Standort des Messaging-Hosts.
  • Der Zugriff auf den angegebenen Host für natives Messaging ist unzulässig.
    • Ist der Ursprung der Erweiterung in allowed_origins aufgeführt?
  • Bei der Kommunikation mit dem Host für natives Messaging ist ein Fehler aufgetreten.
    • Dies ist ein sehr häufiger Fehler und deutet auf eine falsche Implementierung des Kommunikationsprotokolls hin. im Host für natives Messaging.
    • Achten Sie darauf, dass die gesamte Ausgabe in stdout dem nativen Messaging-Protokoll entspricht. Bei Bedarf , um einige Daten für die Fehlerbehebung auszugeben, schreiben Sie in stderr.
    • Achten Sie darauf, dass die 32-Bit-Nachrichtenlänge dem nativen Ganzzahlformat der Plattform (Little-Endian) entspricht. / Big-Endian).
    • Die Nachricht darf nicht länger als 1.024 × 1.024 Zeichen sein.
    • Die Nachrichtengröße muss der Anzahl der Byte in der Nachricht entsprechen. Diese kann sich von der "length" einer Zeichenfolge, da Zeichen durch mehrere Bytes dargestellt werden können.
    • Nur Windows: Achten Sie darauf, dass der E/A-Modus des Programms auf O_BINARY eingestellt ist. Standardmäßig zeigt die E/A Modus ist O_TEXT, wodurch das Nachrichtenformat beschädigt wird, da Zeilenumbrüche (\n = 0A) ersetzt werden durch Linienenden im Windows-Stil (\r\n = 0D 0A). Der E/A-Modus kann mit __setmode festgelegt werden.