기본 메시지

확장 프로그램 및 앱은 다음과 유사한 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이 stdinstdout를 사용하여 호스트와 통신해야 함을 나타냅니다.
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에서 기본 메시지 호스트의 매니페스트 파일 위치는 브라우저 (Chrome 또는 Chromium)를 선택합니다. 시스템 전체의 기본 메시지 호스트는 고정된 위치인 반면, 사용자 수준의 기본 메시지 호스트는 사용자 프로필 디렉터리 - NativeMessagingHosts

  • OS X (시스템 전체) <ph type="x-smartling-placeholder">
      </ph>
    • 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>
    • 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>
    • 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>
    • Chrome: ~/.config/google-chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • Chromium: ~/.config/chromium/NativeMessagingHosts/_com.my_company.my_application_.json

기본 메시지 프로토콜

Chrome은 각각의 기본 메시지 호스트를 별도의 프로세스에서 시작하고 표준 입력 (stdin)과 표준 출력 (stdout)을 선택합니다. 같은 형식으로 메시지를 보낼 때 양방향: 각 메시지는 JSON, UTF-8 인코딩을 사용하여 직렬화되고 32비트로 시작됩니다. 메시지 길이입니다. 기본 메시지의 단일 메시지의 최대 크기입니다. 호스트 파일 크기는 1MB이며 주로 오작동하는 기본 응용 프로그램으로부터 Chrome을 보호하기 위한 것입니다. 포드의 최대 크기는 기본 메시지 호스트로 전송되는 메시지의 최대 크기는 4GB입니다.

기본 메시지 호스트의 첫 번째 인수는 호출자의 출처이며 일반적으로 chrome-extension://[ID of allowed extension] 이를 통해 기본 메시지 호스트는 allowed_origins 키에 여러 확장 프로그램이 지정된 경우 메시지의 소스입니다. 네이티브 메시징 호스트 매니페스트를 참조하세요. 경고: Windows의 Chrome 54 이하에서는 출처가 두 번째 매개변수로 전달되었습니다. 를 사용합니다.

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: 해당 포트에서 메시지 수신 대기를 시작하고 발신 메시지 하나를 전송합니다. 메시지:

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">
      </ph>
    • Windows 레지스트리에서 기본 메시지 호스트를 찾을 수 없습니다. regedit를 사용하여 다시 확인 키가 실제로 생성되었고 기본 메시지 호스트 위치를 참조하세요.
  • 지정된 기본 메시지 호스트에 대한 액세스가 금지되어 있습니다.
    • 확장 프로그램의 출처가 allowed_origins에 등록되어 있나요?
  • 기본 메시지 호스트와 통신하는 중에 오류가 발생했습니다.
    • 매우 흔한 오류이며, 통신 프로토콜이 잘못 구현되었음을 나타냅니다. 기본 메시지 호스트에서 수행됩니다.
    • stdout의 모든 출력이 네이티브 메시지 프로토콜을 준수하는지 확인합니다. 원하는 경우 디버깅을 위해 일부 데이터를 출력하려면 stderr에 씁니다.
    • 32비트 메시지 길이가 플랫폼의 네이티브 정수 형식 (little-endian)인지 확인합니다. / big-endian)입니다.
    • 메시지 길이는 1024*1024를 초과할 수 없습니다.
    • 메시지 크기는 메시지의 바이트 수와 같아야 합니다. 이는 '길이' 이는 문자는 여러 바이트로 표현될 수 있기 때문입니다.
    • Windows만 해당: 프로그램의 I/O 모드가 O_BINARY로 설정되어 있는지 확인합니다. 기본적으로 I/O는 모드가 O_TEXT인 경우 줄바꿈 (\n = 0A)이 다음으로 대체되어 메시지 형식이 손상됩니다. Windows 스타일의 줄 끝 (\r\n = 0D 0A)입니다. I/O 모드는 __setmode를 사용하여 설정할 수 있습니다.