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

ユーザーのデバイスにインストールされているネイティブ Win32 アプリと通信するために、拡張機能では、他の メッセージ渡し API と同様の API が使用されます。 ネイティブ アプリ ホストは、標準入力と標準出力を使用して、拡張機能を含むメッセージを送受信します。

ネイティブ メッセージングを使用する拡張機能は、他の拡張機能と同様に Microsoft Edge にインストールされます。 ただし、ネイティブ アプリは Microsoft Edge によってインストールまたは管理されません。

拡張機能とネイティブ アプリ ホストを取得するには、次の 2 つの異なる配布モデルがあります。

  • 拡張機能とホストをパッケージ化します。 ユーザーがパッケージをインストールすると、拡張機能とホストの両方がインストールされます。

  • または、 Microsoft Edge アドオン Web サイトを使用して拡張機能をインストールすると、ユーザーにホストのインストールを求めるメッセージが表示されます。

ネイティブ アプリ ホストでメッセージを送受信する拡張機能を作成するには、次の手順を実行します。

手順 1: 拡張機能マニフェストにアクセス許可を追加する

拡張機能の nativeMessagingmanifest.json ファイルにアクセス許可を追加します。

これは 拡張マニフェスト ファイルであり、 ネイティブ メッセージング ホスト マニフェスト ファイルではありません。これについては、後のセクションで説明します。

manifest.json ファイルの例を次に示します。

{
    "name": "Native Messaging Example",
    "version": "1.0",
    "manifest_version": 3,
    "description": "Send a message to a native app.",
    "app": {
        "launch": {
            "local_path": "main.html"
        }
    },
    "icons": {
        "128": "icon-128.png"
    },
    "permissions": ["nativeMessaging"]
}

手順 2: ネイティブ メッセージング ホスト マニフェスト ファイルを作成する

ネイティブ アプリは、ネイティブ メッセージング ホスト マニフェスト ファイルを提供する必要があります。 ネイティブ メッセージング ホスト マニフェスト ファイルには、次の情報が含まれています。

  • ネイティブ メッセージング ホスト ランタイムへのパス。

  • 拡張機能との通信方法。

  • 通信先の許可される拡張機能の一覧。

ブラウザーは、ネイティブ メッセージング ホスト マニフェストを読み取り、検証します。 ブラウザーは、ネイティブ メッセージング ホスト マニフェスト ファイルをインストールまたは管理しません。

ネイティブ メッセージング ホスト マニフェスト ファイルは、Microsoft Edge 拡張機能の一部であるマニフェスト V3 または V2 ファイルとは異なります。

ネイティブ メッセージング ホスト マニフェスト ファイルの例:

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

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

キー 詳細
name ネイティブ メッセージング ホストの名前を指定します。 クライアントは、 または runtime.sendNativeMessageに文字列をruntime.connectNative渡します。
値には、小文字の英数字、アンダースコア、ドットのみを含める必要があります。
値はドット (ピリオド) で開始または終了することはできません。また、ドットの後に別のドットを付けてはいけません。
description アプリについて説明します。
path ネイティブ メッセージング ホスト バイナリへのパスを指定します。
Windows デバイスでは、ネイティブ メッセージング ホスト マニフェスト ファイルを含むディレクトリへの相対パスを使用できます。
macOS と Linux では、パスは絶対パスである必要があります。
ホスト プロセスは、現在のディレクトリがホスト バイナリを含むディレクトリに設定された状態で開始されます。 たとえば (Windows) では、 パラメーターが に C:\App\nm_host.exe設定されている場合、バイナリは現在のディレクトリ (C:\App\) を使用して開始されます。
type ネイティブ メッセージング ホストとの通信に使用するインターフェイスの種類を指定します。 この値は、ホストと通信するために と stdout を使用stdinするように Microsoft Edge に指示します。 許容される値は stdioのみです。
allowed_origins ネイティブ メッセージング ホストにアクセスできる拡張機能の一覧を指定します。 拡張機能を識別して通信するようにアプリを有効にするには、ネイティブ メッセージング ホスト マニフェスト ファイルで次の値を設定します。
"allowed_origins": ["chrome-extension://{microsoft_catalog_extension_id}"]

拡張機能をサイドロードして、ホストでネイティブ メッセージングをテストします。 開発中に拡張機能をサイドロードして取得 microsoft_catalog_extension_idするには:

  1. edge://extensions移動し、[ 開発者モード ] トグル ボタンをオンにします。

  2. [ 開梱された読み込み] を選択し、サイドロードする拡張機能パッケージを選択します。

  3. [OK] をクリックします。

  4. ページに edge://extensions 移動し、拡張機能が一覧表示されていることを確認します。

  5. ページの microsoft_catalog_extension_id 拡張機能の一覧からキー (ID) をコピーします。

拡張機能をユーザーに配布する準備ができたら、Microsoft Edge アドオン Web サイトに拡張機能を発行します。 公開された拡張機能の拡張機能 ID は、拡張機能のサイドローディング中に使用される ID とは異なる場合があります。 ID が変更された場合は、公開されている拡張機能の ID を使用してネイティブ メッセージング ホスト マニフェスト ファイルで更新 allowed_origins します。

手順 3: ネイティブ メッセージング ホスト マニフェスト ファイルをシステムにコピーする

最後の手順では、ネイティブ メッセージング ホスト マニフェスト ファイルをコンピューターにコピーし、このマニフェスト ファイルが正しく構成されていることを確認します。 ネイティブ メッセージング ホスト マニフェスト ファイルが想定される場所に配置されるようにするには、次の手順を実行します。 場所はプラットフォームによって異なります。

Linux と macOS の場合:

  • ネイティブ メッセージング ホスト マニフェスト ファイルに対する 読み取り アクセス許可を必ず指定してください。
  • ホスト ランタイムに対する 実行 アクセス許可を必ず指定してください。

ネイティブ メッセージング ホスト マニフェスト ファイルは、ファイル システム内の任意の場所に配置できます。 アプリ インストーラーはレジストリ キーを作成し、キーの既定値をネイティブ メッセージング ホスト マニフェスト ファイルの完全パスに設定する必要があります。

レジストリ キーの例を次に示します。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app

マニフェスト キーを使用してレジストリ キーをディレクトリに追加するには、次のいずれかの操作を行います。

  • コマンド プロンプトでコマンドを実行します。

    REG ADD "HKCU\Software\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app" /ve /t REG_SZ /d "C:\path\to\nmh-manifest.json" /f
    
  • または、次のようにファイルを .reg 作成して実行します。

    1. 次のコマンドをファイルに .reg コピーします。

      Windows Registry Editor Version 5.00
      [HKEY_CURRENT_USER\Software\Microsoft\Edge\NativeMessagingHosts\com.my_company.my_app]
      @="C:\\path\\to\\nmh-manifest.json"
      
    2. ファイルを実行します .reg 。 作成した .reg ファイルをバッチ スクリプトの一部として実行する場合は、管理者コマンド プロンプトを使用して実行してください。

Microsoft Edge では、ルート キーに HKEY_CURRENT_USER 続いて を照会します HKEY_LOCAL_MACHINE。 どちらのキーでも、最初に 32 ビット レジストリが検索され、次にネイティブ メッセージング ホストを識別するために 64 ビット レジストリが検索されます。 レジストリ キーは、ネイティブ メッセージング ホスト マニフェスト ファイルの場所を指定します。

Microsoft Edge のレジストリ エントリにネイティブ メッセージング ホスト マニフェスト ファイルの場所がない場合は、Chromiumと Chrome のレジストリの場所がフォールバック オプションとして使用されます。

Microsoft Edge は、以前に一覧表示された場所のいずれかでレジストリ キーを見つけた場合、次のコード スニペットに記載されている場所に対してクエリを実行しません。

レジストリの場所の検索順序は次のとおりです。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\
HKEY_CURRENT_USER\SOFTWARE\Chromium\NativeMessagingHosts\
HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Edge\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Chromium\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Google\Chrome\NativeMessagingHosts\

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\Chromium\NativeMessagingHosts\
HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\

WOW6432Node レジストリ ノード

HKEY_CURRENT_USER\SOFTWARE\WOW6432Nodeレジストリ ノードは、64 ビット コンピューターでは検索されません。これは、レジストリの動作方法が原因です。 詳細については、「 Windows 上の Windows を含む Windows インストールの影響を受けるレジストリ キー (WOW) による複数のプロセッサ アーキテクチャのサポート」を参照してください。

両方のストアに必要な拡張 ID

Microsoft Edge アドオンと Chrome Web ストアに拡張機能がある場合は、ネイティブ メッセージング ホスト マニフェスト ファイルの 両方のストア allowed_origins に対応する拡張機能 ID を追加する必要があります。 最初に見つかったレジストリの場所に対応するネイティブ メッセージング ホスト マニフェスト ファイルのみが読み取られるので、これは必須です。

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

Microsoft Edge は、各ネイティブ メッセージング ホストを個別のプロセスで開始し、標準入力 () と標準出力 (stdinstdout) を使用して通信します。 メッセージを双方向に送信するには、同じ形式が使用されます。各メッセージは、UTF-8 でエンコードされた JSON を使用してシリアル化され、ネイティブ バイト順に 32 ビットのメッセージ長が先行します。 ネイティブ メッセージング ホストからの 1 つのメッセージの最大サイズは 1 MB です。主に、Microsoft Edge がネイティブ アプリケーションを誤って動作しないように保護します。 ネイティブ メッセージング ホストに送信されるメッセージの最大サイズは 4 GB です。

ネイティブ メッセージング ホストの最初の引数は、呼び出し元 (通常 chrome-extension://[ID of allowed extension]は ) です。 これにより、ネイティブ メッセージング ホスト マニフェストのキーに allowed_origins 複数の拡張機能が指定されている場合に、ネイティブ メッセージング ホストはメッセージのソースを識別できます。上記の 「手順 2: ネイティブ メッセージング ホスト マニフェスト ファイルを作成する」を参照してください。

Windows では、ネイティブ メッセージング ホストには、呼び出し元の Microsoft Edge ネイティブ ウィンドウへのハンドルを持つコマンド ライン引数も渡されます。 --parent-window=<decimal handle value> これにより、ネイティブ メッセージング ホストは、正しく親であるネイティブ UI ウィンドウを作成できます。 呼び出し元のコンテキストがサービス ワーカーの場合、この値は 0 になります。

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

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

ネイティブ アプリケーションとの間でメッセージを送受信することは、クロス拡張機能メッセージングとよく似ています。 メイン違いは、 runtime.connectNative ではなく を使用しruntime.sendNativeMessage、 ではなく runtime.connectを使用runtime.sendMessageすることです。

これらのメソッドを使用するには、拡張機能の nativeMessaging マニフェスト ファイルでアクセス許可を宣言する必要があります。上記の 「手順 1: 拡張機能マニフェストにアクセス許可を追加する」を参照してください。

これらのメソッドは、拡張機能のページとサービス ワーカー内でのみ、コンテンツ スクリプト内では使用できません。 コンテンツ スクリプトからネイティブ アプリケーションに通信する場合は、メッセージをサービス ワーカーに送信してネイティブ アプリケーションに渡します。

次の例では、 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);
  }
);

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

特定のネイティブ メッセージングエラーが発生すると、Microsoft Edge のエラー ログに出力が書き込まれます。 これには、ネイティブ メッセージング ホストの起動に失敗した場合、通信プロトコルへの stderr 書き込み、または通信プロトコルへの違反が含まれます。 Linux および macOS では、コマンド ラインから Microsoft Edge を起動し、ターミナルでその出力を監視することで、このログに簡単にアクセスできます。 Windows では、「ログ記録を有効にする方法」で説明されているようにを使用--enable-loggingします。

それらを解決するための一般的なエラーとヒントを次に示します。

ネイティブ メッセージング ホストを開始できませんでした。

ネイティブ メッセージング ホスト ファイルを実行するための十分なアクセス許可があるかどうかを確認します。

指定されたネイティブ メッセージング ホスト名が無効です。

名前に無効な文字が含まれているかどうかを確認します。 小文字の英数字、アンダースコア、ドット (ピリオド) のみを使用できます。 名前をドットで始めたり終えたりすることはできません。また、ドットの後に別のドットを付けることはできません。

ネイティブ ホストが終了しました。

ネイティブ メッセージング ホストへのパイプは、Microsoft Edge がメッセージを読み取る前に破損していました。 これは、ネイティブ メッセージング ホストから開始される可能性が最も高いです。

指定されたネイティブ メッセージング ホストが見つかりません。

以下のことを確認してください。

  • 拡張子とマニフェスト ファイルで名前のスペルが正しいかどうか。

  • マニフェストは適切なディレクトリにあり、正しい名前ですか? 想定される形式については、「 ネイティブ メッセージング ホストの場所 」を参照してください。

  • マニフェスト ファイルの形式は正しいですか? 特に、JSON は有効で整形式であり、値は、上記の手順 2: ネイティブ メッセージング ホスト マニフェスト ファイルの作成に従って、 ネイティブ メッセージング ホスト マニフェスト の定義と一致しますか?

  • で指定されたファイルは path 存在しますか? Windows の場合、パスは相対パスである可能性がありますが、macOS と Linux では、パスは絶対パスである必要があります。

ネイティブ メッセージング ホスト ホスト名 が登録されていません。 (Windows のみ)

ネイティブ メッセージング ホストが Windows レジストリに見つかりませんでした。 キーが実際に作成され、ネイティブ メッセージング ホストの場所で説明されているように、必要な形式と一致するかどうかを使用regeditしてダブルチェックします。

指定されたネイティブ メッセージング ホストへのアクセスは禁止されています。

拡張機能の配信元は に表示されますか allowed_origins?

ネイティブ メッセージング ホストとの通信中にエラーが発生しました。

これは、ネイティブ メッセージング ホストでの通信プロトコルの不適切な実装を示します。

  • のすべての stdout 出力が ネイティブ メッセージング プロトコルに準拠していることを確認します。 デバッグ目的でデータを印刷する場合は、 に stderr書き込みます。

  • 32 ビット メッセージの長さがプラットフォームのネイティブ整数形式 (リトル エンディアンまたはビッグ エンディアン) であることを確認します。

  • メッセージの長さは 1024*1024 を超えてはなりません。

  • メッセージ サイズは、メッセージ内のバイト数と同じである必要があります。 文字は複数のバイトで表される可能性があるため、これは文字列の "長さ" とは異なる場合があります。

  • Windows 専用: プログラムの I/O モードが に O_BINARY設定されていることを確認します。 既定では、I/O モードは です。これは、改行 () が O_TEXTWindows スタイルの行の終わり (\r\n0D 0A\n = 0A = ) に置き換えられるとメッセージ形式が破損します。 I/O モードは、 を使用 __setmodeして設定できます。

注:

このページの一部は、 Google によって 作成および共有され、 クリエイティブ・コモンズ属性 4.0 国際ライセンスに記載されている条件に従って使用される作業に基づく変更です。 元のページはこちらにあります。

クリエイティブ・コモンズ・ライセンス この作品は 、クリエイティブ・コモンズ属性4.0国際ライセンスに基づきライセンスされています