Native berichten

Extensies kunnen berichten uitwisselen met native applicaties via een API die vergelijkbaar is met andere API's voor berichtdoorgifte . Native applicaties die deze functie ondersteunen, moeten een native berichtenhost registreren die met de extensie kan communiceren. Chrome start de host in een apart proces en communiceert ermee via standaardinvoer- en standaarduitvoerstromen.

Native berichtenhost

Om een ​​native messaging-host te registreren, moet de toepassing een bestand opslaan waarin de configuratie van de native messaging-host is gedefinieerd.

Een voorbeeld van het bestand is als volgt:

{
  "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/"]
}

Het manifestbestand voor de host voor native messaging moet een geldige JSON zijn en de volgende velden bevatten:

name
Naam van de native messaging-host. Clients geven deze string door aan runtime.connectNative() of runtime.sendNativeMessage() . Deze naam mag alleen kleine alfanumerieke tekens, onderstrepingstekens en punten bevatten. De naam mag niet beginnen of eindigen met een punt, en een punt mag niet worden gevolgd door een andere punt.
description
Korte beschrijving van de toepassing.
path
Pad naar het binaire bestand van de native berichtenhost. Op Linux en macOS moet het pad absoluut zijn. Op Windows kan het relatief zijn ten opzichte van de map met het manifestbestand. Het hostproces wordt gestart met de huidige map ingesteld op de map met het binaire bestand van de host. Als deze parameter bijvoorbeeld is ingesteld op C:\Application\nm_host.exe , wordt het gestart met de huidige map 'C:\Application'.
type
Het type interface dat wordt gebruikt om te communiceren met de native berichtenserver. Deze parameter heeft één mogelijke waarde: stdio . Dit geeft aan dat Chrome stdin en stdout moet gebruiken om met de server te communiceren.
allowed_origins
Lijst met extensies die toegang moeten hebben tot de native berichten-host. allowed-origins -waarden mogen geen jokers bevatten.

Locatie van de native berichtenhost

De locatie van het manifestbestand is afhankelijk van het platform.

In Windows kan het manifestbestand zich overal in het bestandssysteem bevinden. Het installatieprogramma van de applicatie moet een registersleutel aanmaken, HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application of HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.my_company.my_application , en de standaardwaarde van die sleutel instellen op het volledige pad naar het manifestbestand. Gebruik bijvoorbeeld de volgende opdracht:

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

of door het volgende .reg -bestand te gebruiken:

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

Wanneer Chrome naar hosts voor systeemeigen berichten zoekt, wordt eerst het 32-bits register geraadpleegd en vervolgens het 64-bits register.

Op macOS en Linux varieert de locatie van het manifestbestand van de native messaging-host per browser (Google Chrome of Chromium). De native messaging-hosts voor het hele systeem worden op een vaste locatie opgezocht, terwijl de native messaging-hosts op gebruikersniveau worden opgezocht in de submap NativeMessagingHosts/ van de gebruikersprofielmap .

macOS (systeembreed)
Google Chrome: /Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json
Chromium: /Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json
macOS (gebruikerspecifiek, standaardpad )
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 (systeembreed)
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 (gebruikerspecifiek, standaardpad )
Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/com.my_company.my_application.json
Chromium: ~/.config/chromium/NativeMessagingHosts/com.my_company.my_application.json

Native berichtenprotocol

Chrome start elke native messaging-host in een apart proces en communiceert ermee via standaardinvoer ( stdin ) en standaarduitvoer ( stdout ). Berichten worden in beide richtingen verzonden volgens hetzelfde formaat; elk bericht wordt geserialiseerd met JSON, UTF-8-gecodeerd en wordt voorafgegaan door een berichtlengte van 32 bits in native bytevolgorde. De maximale grootte van een enkel bericht van de native messaging-host is 1 MB, voornamelijk om Chrome te beschermen tegen problemen met native applicaties. De maximale grootte van het bericht dat naar de native messaging-host wordt verzonden, is 64 MB.

Het eerste argument voor de native messaging-host is de oorsprong van de aanroeper, meestal chrome-extension://[ID of allowed extension] . Hierdoor kunnen native messaging-hosts de bron van het bericht identificeren wanneer er meerdere extensies zijn opgegeven in de sleutel allowed_origins in het manifest van de native messaging-host .

In Windows krijgt de host voor native messaging ook een opdrachtregelargument met een handle naar het aanroepende Chrome-native venster: --parent-window=<decimal handle value> . Hiermee kan de host voor native messaging native UI-vensters maken die correct zijn gekoppeld aan een parent. Deze waarde is 0 als de aanroepende context een service worker is.

Wanneer een berichtenpoort wordt aangemaakt met runtime.connectNative() start Chrome een native berichtenhostproces en houdt dit actief totdat de poort wordt verwijderd. Wanneer daarentegen een bericht wordt verzonden met runtime.sendNativeMessage() , zonder een berichtenpoort aan te maken, start Chrome voor elk bericht een nieuw native berichtenhostproces. In dat geval wordt het eerste bericht dat door het hostproces wordt gegenereerd, verwerkt als antwoord op de oorspronkelijke aanvraag en geeft Chrome dit door aan de antwoordcallback die is opgegeven bij het aanroepen van runtime.sendNativeMessage() . Alle andere berichten die door de native berichtenhost worden gegenereerd, worden in dat geval genegeerd.

Verbinding maken met een native applicatie

Het verzenden en ontvangen van berichten van en naar een native applicatie is zeer vergelijkbaar met cross-extension messaging. Het belangrijkste verschil is dat runtime.connectNative() wordt gebruikt in plaats van runtime.connect() en runtime.sendNativeMessage() in plaats van runtime.sendMessage() .

Om deze methoden te kunnen gebruiken, moet de machtiging 'nativeMessaging' worden gedeclareerd in het manifestbestand van uw extensies.

Deze methoden zijn niet beschikbaar in contentscripts, maar alleen in de pagina's en service worker van uw extensie. Als u vanuit een contentscript met de native applicatie wilt communiceren, stuur dan het bericht naar uw service worker om het door te geven aan de native applicatie.

In het volgende voorbeeld wordt een runtime.Port -object gemaakt dat is verbonden met de native berichtenhost com.my_company.my_application , begint te luisteren naar berichten van die poort en één uitgaand bericht verzendt:

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'});

Gebruik runtime.sendNativeMessage om een ​​bericht naar de native applicatie te sturen zonder een poort te maken, bijvoorbeeld:

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

Debug native berichten

Wanneer bepaalde fouten in de native messaging-omgeving optreden, wordt de uitvoer naar het foutenlogboek van Chrome geschreven. Dit geldt ook wanneer de native messaging-host niet start, naar stderr schrijft of het communicatieprotocol schendt. Op Linux en macOS is dit logboek toegankelijk door Chrome vanaf de opdrachtregel te starten en de uitvoer in de terminal te bekijken. Gebruik in Windows --enable-logging zoals uitgelegd in Hoe logging inschakelen .

Hier zijn enkele veelvoorkomende fouten en tips om ze op te lossen:

Het is niet gelukt om de native berichtenhost te starten.

Controleer of u voldoende machtigingen hebt om het hostbestand voor de oorspronkelijke berichten uit te voeren.

Er is een ongeldige hostnaam voor native messaging opgegeven.

Controleer of de naam ongeldige tekens bevat. Alleen kleine alfanumerieke tekens, onderstrepingstekens en punten zijn toegestaan. Een naam mag niet beginnen of eindigen met een punt, en een punt mag niet worden gevolgd door een andere punt.

De native host is afgesloten.

De verbinding met de native berichtenserver was verbroken voordat het bericht door Chrome werd gelezen. Dit wordt waarschijnlijk veroorzaakt door je native berichtenserver.

De opgegeven host voor native messaging is niet gevonden.

Controleer het volgende:

  • Is de naam correct gespeld in de extensie en in het manifestbestand?
  • Staat het manifest in de juiste map en heeft het de juiste naam? Zie de hostlocatie van de native messaging voor de verwachte formaten.
  • Heeft het manifestbestand de juiste opmaak? Is de JSON met name geldig en correct geformuleerd en komen de waarden overeen met de definitie van een native messaging-hostmanifest ?
  • Bestaat het in path opgegeven bestand? In Windows kunnen paden relatief zijn, maar op macOS en Linux moeten de paden absoluut zijn.

De hostnaam van de native messaging-host is niet geregistreerd. (Alleen Windows)

De native messaging-host is niet gevonden in het Windows-register. Controleer met regedit of de sleutel daadwerkelijk is aangemaakt en overeenkomt met de vereiste indeling zoals gedocumenteerd op de native messaging-hostlocatie .

Toegang tot de opgegeven native messaging-host is verboden.

Wordt de oorsprong van de extensie vermeld in allowed_origins ?

Fout bij communicatie met de oorspronkelijke berichtenserver.

Dit duidt op een onjuiste implementatie van het communicatieprotocol in de oorspronkelijke berichtenserver.

  • Zorg ervoor dat alle uitvoer in stdout voldoet aan het native berichtenprotocol . Als u gegevens wilt afdrukken voor foutopsporing, schrijf dan naar stderr .
  • Zorg ervoor dat de berichtlengte van 32 bits de standaard integer-indeling van het platform heeft (little-endian / big-endian).
  • De berichtlengte mag niet groter zijn dan 1024*1024.
  • De berichtgrootte moet gelijk zijn aan het aantal bytes in het bericht. Dit kan afwijken van de "lengte" van een string, omdat tekens door meerdere bytes kunnen worden weergegeven.
  • Alleen voor Windows: Zorg ervoor dat de I/O-modus van het programma is ingesteld op O_BINARY . Standaard is de I/O-modus O_TEXT , waardoor de berichtopmaak wordt verstoord doordat regeleinden ( \n = 0A ) worden vervangen door Windows-stijl regeleinden ( \r\n = 0D 0A ). De I/O-modus kan worden ingesteld met __setmode .