ネイティブ メッセージング

拡張機能やアプリは、同様の API を使用してネイティブ アプリケーションとメッセージを交換できます。 他のメッセージ受け渡し API。この機能をサポートするネイティブ アプリは、 拡張機能との通信方法を認識しているネイティブ メッセージング ホスト。Chrome がホストを開始するまでの時間 独立したプロセスに送られ、標準入力ストリームと標準出力ストリームを使用してプロセスと通信します。

ネイティブ メッセージング ホスト

ネイティブ メッセージング ホストを登録するには、アプリケーションでマニフェスト ファイルをインストールする必要があります。 では、ネイティブ メッセージングのホスト構成を定義します。マニフェスト ファイルの例を次に示します。

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

ネイティブ メッセージング ホストのマニフェスト ファイルは有効な JSON で、次のフィールドが含まれている必要があります。

名前説明
nameネイティブ メッセージング ホストの名前。クライアントは、この文字列を runtime.connectNative または runtime.sendNativeMessage に渡します。名前に使用できるのは、英小文字、数字、アンダースコア、ドットのみです。名前の先頭または末尾にドットを使用することはできません。また、ドットの後に別のドットを続けることはできません。
descriptionアプリケーションの簡単な説明。
pathネイティブ メッセージングのホストバイナリへのパス。Linux と OSX では、パスは絶対パスである必要があります。Windows では、マニフェスト ファイルがあるディレクトリからの相対パスを指定できます。ホストプロセスは、ホストバイナリを含むディレクトリに現在のディレクトリを設定して開始されます。たとえば、このパラメータを C:\Application\nm_host.exe に設定した場合、現在のディレクトリ C:\Application\ で開始されます。
typeネイティブ メッセージング ホストとの通信に使用されるインターフェースのタイプ。現在、このパラメータに指定できる値は stdio のみです。これは、Chrome がホストとの通信に stdin および stdout を使用する必要があることを示しています。
allowed_originsネイティブ メッセージング ホストにアクセスできる拡張機能のリスト。chrome-extension://*/* などのワイルドカードは使用できません。

ネイティブ メッセージングのホストのロケーション

マニフェスト ファイルの場所はプラットフォームによって異なります。

Windows では、マニフェスト ファイルはファイル システムの任意の場所に配置できます。アプリケーション レジストリキーを作成し、 HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ または HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ そのキーのデフォルト値は、マニフェスト ファイルのフルパスに設定します。たとえば、 次のコマンドを実行します。

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

または、次の .reg ファイルを使用します。

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

Chrome がネイティブ メッセージング ホストを検索するときは、まず 32 ビットのレジストリ、次に 64 ビットのレジストリ されます。

OS XLinux では、ネイティブ メッセージング ホストのマニフェスト ファイルの場所は、 ブラウザ(Google Chrome または Chromium)でインストールできます。システム全体のネイティブ メッセージング ホストは、固定の ユーザーレベルのネイティブ メッセージング ホストは、 ユーザー プロファイル ディレクトリNativeMessagingHosts)を作成します。

  • OS X(システム全体) <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(ユーザー固有のデフォルト パス) <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(システム全体) <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(ユーザー固有のデフォルト パス) <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

ネイティブ メッセージング プロトコル

Chrome は各ネイティブ メッセージング ホストを個別のプロセスで起動し、 標準入力(stdin)と標準出力(stdout)です。同じ形式で、 両方向: 各メッセージは UTF-8 エンコーディングの JSON を使用してシリアル化され、先頭に 32 ビット ネイティブ バイト順でのメッセージ長を返します。ネイティブ メッセージングからの 1 つのメッセージの最大サイズ ホストを 1 MB に増やしています。これは主に、ネイティブ アプリの誤動作から Chrome を保護するためです。各 Pod の最大サイズは、 最大 4 GB です。

ネイティブ メッセージング ホストの最初の引数は、呼び出し元のオリジンです。 chrome-extension://[ID of allowed extension]。これによりネイティブメッセージングホストは 複数の拡張機能が allowed_origins キーで指定された場合のメッセージのソース ネイティブ メッセージングのホスト マニフェスト警告: Windows の Chrome 54 以前では、オリジンが 2 番目のパラメータとして渡されていました 最初のパラメータではなく

runtime.connectNative を使用してメッセージ ポートを作成すると、Chrome がネイティブ メッセージングを開始します ポートが破棄されるまで実行を継続します。一方、メッセージが runtime.sendNativeMessage を使用して送信されたメッセージの場合、メッセージ ポートを作成せずに Chrome で ネイティブメッセージングホストプロセスに 対応していますこの場合、ホストによって生成された最初のメッセージは 元のリクエストに対するレスポンスとして処理されます。つまり、Chrome はリクエストをレスポンスに渡します。 runtime.sendNativeMessage が呼び出されたときに指定されたコールバックです。その他のすべてのメッセージ ネイティブメッセージングホストは無視されます

Windows では、ネイティブ メッセージング ホストには、 Chrome ネイティブ ウィンドウ --parent-window=<decimal handle value> を呼び出します。これにより、ネイティブ コンテナは メッセージング ホストは、適切な親を持つネイティブ UI ウィンドウを作成します。この値は実際の値である 呼び出しコンテキストがバックグラウンド スクリプト ページの場合は 0。

ネイティブ アプリケーションへの接続

ネイティブ アプリケーションとのメッセージの送受信は、クロス拡張機能と非常によく似ています。 説明します。主な違いは、runtime.connectNativeruntime.connectruntime.sendNativeMessageruntime.sendMessage. これらのメソッドは、"nativeMessaging"権限が宣言されている 使用します。

次の例では、ネイティブ メッセージング ホストに接続された runtime.Port オブジェクトを作成します。 com.my_company.my_application が、そのポートからのメッセージのリッスンを開始し、1 つの送信 メッセージ:

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

runtime.sendNativeMessage を使用すると、作成せずにネイティブ アプリケーションにメッセージを送信できます。 ポート。例:

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

ネイティブ メッセージのデバッグ

ネイティブ メッセージング ホストの起動に失敗した場合、stderr に書き込むか、 場合、出力は Chrome のエラーログに書き込まれます。Linux と OS X では、このログが コマンドラインから Chrome を起動し、 終端します。Windows では、ロギングを有効にする方法で説明されているように --enable-logging を使用します。

以下に、エラーとその解決のヒントをいくつか紹介します。

  • ネイティブ メッセージング ホストを開始できませんでした。
    • ファイルを実行するのに十分な権限があるかどうかを確認します。
  • 指定したネイティブ メッセージングのホスト名が無効です。
    • 名前に無効な文字が含まれていないかどうかを確認します。小文字の英数字のみ、 アンダースコアとドットを使用できます。名前の先頭または末尾にドットを使用することはできません。 その後にドットが続きます
  • ネイティブ ホストが終了しました。
    • Chrome でメッセージが読み取られる前に、ネイティブ メッセージング ホストへのパイプが切断されました。これは最も ネイティブ メッセージング ホストから開始される可能性が高いためです。
  • 指定されたネイティブ メッセージング ホストが見つかりません。
    • 拡張機能とマニフェスト ファイルで名前のスペルが正しいかどうかを確認します。
    • マニフェストは正しいディレクトリに配置され、正しい名前が付けられているか。ネイティブ メッセージング ホストの説明を参照 location を指定する必要があります。
    • マニフェスト ファイルの形式は正しいですか?特に、JSON 構文が正しいことを確認し、 値がネイティブ メッセージング ホスト マニフェストの定義と一致しているかを確認します。
    • path で指定されたファイルは存在しますか?Windows では相対パスを指定できますが、OS X と Linux では 絶対パスである必要があります。
  • ネイティブ メッセージング ホストのホスト名が登録されていません。(Windows のみ) <ph type="x-smartling-placeholder">
  • 指定したネイティブ メッセージング ホストへのアクセスは禁止されています。
    • 拡張機能のオリジンは allowed_origins にリストされていますか?
  • ネイティブ メッセージング ホストとの通信中にエラーが発生しました。
    • これは非常によくあるエラーであり、通信プロトコルが正しく実装されていないことを示します。 ネイティブメッセージングホストで 使用できます
    • stdout のすべての出力がネイティブ メッセージング プロトコルに準拠していることを確認します。目標 デバッグ用にデータを出力するには、stderr に書き込みます。
    • 32 ビットのメッセージ長がプラットフォームのネイティブ整数形式(リトル エンディアン) / ビッグ エンディアン)。
    • メッセージの長さは 1,024×1,024 を超えないようにしてください。
    • メッセージ サイズはメッセージのバイト数と同じである必要があります。これは、 「長さ」これは、文字が複数のバイトで表される場合があるためです。
    • Windows のみ: プログラムの I/O モードが O_BINARY に設定されていることを確認します。デフォルトでは、 モードが O_TEXT の場合、改行(\n = 0A)が置き換えられるため、メッセージ形式が破損します。 Windows スタイルの行末(\r\n = 0D 0A)。I/O モードは __setmode で設定できます。