Yerel Mesajlaşma

Uzantılar ve uygulamalar, aşağıdakilere benzer bir API kullanarak yerel uygulamalarla mesaj alışverişi yapabilir: API'leri geçiren diğer mesaj. Bu özelliği destekleyen yerel uygulamaların bir yerel mesajlaşma ana makinesi ile çalışır. Chrome, ana makineyi şurada başlatır: ayrı bir süreç oluşturur ve standart giriş ve standart çıkış akışlarını kullanarak bununla iletişim kurar.

Yerel mesajlaşma ana makinesi

Yerel mesajlaşma ana makinesini kaydetmek için uygulamanın yerel mesajlaşma ana makine yapılandırmasını tanımlar. Aşağıda manifest dosyasının bir örneği verilmiştir:

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

Yerel mesajlaşma ana makine manifest dosyası geçerli JSON olmalıdır ve aşağıdaki alanları içermelidir:

AdAçıklama
nameYerel mesajlaşma ana makinesinin adı. İstemciler bu dizeyi runtime.connectNative veya runtime.sendNativeMessage'a iletir. Bu ad yalnızca küçük alfanümerik karakterler, alt çizgiler ve noktalar içerebilir. Ad noktayla başlayamaz veya bitemez ve noktanın ardından başka bir nokta gelemez.
descriptionKısa uygulama açıklaması.
pathYerel mesajlaşma ana makine ikili programının yolu. Linux ve OSX'te yol mutlak olmalıdır. Windows'da ise manifest dosyasının bulunduğu dizinle ilişkili olabilir. Ana makine işlemi, ana makine ikili programını içeren dizine ayarlanmış olan geçerli dizinle başlar. Örneğin, bu parametre C:\Application\nm_host.exe değerine ayarlanırsa mevcut dizin (C:\Application\) ile başlatılır.
typeYerel mesajlaşma ana makinesiyle iletişim kurmak için kullanılan arayüzün türü. Şu anda bu parametre için yalnızca bir olası değer vardır: stdio. Chrome'un, ana makineyle iletişim kurmak için stdin ve stdout kullanması gerektiğini belirtir.
allowed_originsYerel mesajlaşma ana makinesine erişmesi gereken uzantıların listesi. chrome-extension://*/* gibi joker karakterlere izin verilmez.

Yerel mesajlaşma ana makine konumu

Manifest dosyasının konumu platforma göre değişir.

Windows'da, manifest dosyası, dosya sisteminin herhangi bir yerinde bulunabilir. Uygulama yükleyicinin kayıt defteri anahtarı oluşturması gerekir HKEY_LOCAL_MACHINE\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ veya HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\_com.my_company.my_application_ ve bu anahtarın varsayılan değerini manifest dosyasının tam yolu olarak belirleyin. Örneğin, şu komutu kullanın:

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

veya şu .reg dosyasını kullanarak:

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 yerel mesajlaşma ana makinelerini aradığında, önce 32 bit kayıt defteri, ardından 64 bit kayıt defteri sorgulanır. kayıt otoritesi.

OS X ve Linux'ta, yerel mesajlaşma ana makinesinin manifest dosyasının konumu tarayıcı (Google Chrome veya Chromium) kullanabilirsiniz. Sistem genelinde yerel mesajlaşma ana makineleri, sabit bir konumu bulunurken kullanıcı düzeyindeki yerel mesajlaşma ana makineleri, NativeMessagingHosts adlı kullanıcı profili dizini.

  • OS X (sistem genelinde)
    • 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 (kullanıcıya özel, varsayılan yol)
    • 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 (sistem genelinde)
    • 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 (kullanıcıya özel, varsayılan yol)
    • Google Chrome: ~/.config/google-chrome/NativeMessagingHosts/_com.my_company.my_application_.json
    • Chromium: ~/.config/chromium/NativeMessagingHosts/_com.my_company.my_application_.json

Yerel mesajlaşma protokolü

Chrome, her yerel mesajlaşma ana makinesini ayrı bir işlemde başlatır ve standart giriş (stdin) ve standart çıkış (stdout). Aynı biçim, iletileri şurada göndermek için de kullanılır: Her iki yönde de: Her ileti JSON kullanılarak serileştirilir, UTF-8 kodludur ve öncesinde 32 bit bulunur mesaj uzunluğunu yerel bayt sırasına göre belirler. Yerel mesajlaşmadaki tek bir mesajın maksimum boyutu ana makine 1 MB. Etiketin maksimum boyutu yerel mesajlaşma ana makinesine gönderilen mesajın boyutu 4 GB'tır.

Yerel mesajlaşma ana makinesinin ilk bağımsız değişkeni, genellikle arayanın kaynağıdır. chrome-extension://[ID of allowed extension] Bu, yerel mesajlaşma ana makinelerinin allowed_origins anahtarında birden çok uzantı belirtildiğinde iletinin kaynağını yerel mesajlaşma ana makine manifestini inceleyin. Uyarı: Windows'da, Chrome 54 ve önceki sürümlerde kaynak ikinci parametre olarak geçirilmiştir .

runtime.connectNative kullanılarak mesajlaşma bağlantı noktası oluşturulduğunda Chrome, yerel mesajlaşmayı başlatır. işlemi başlatır ve bağlantı noktası kaldırılana kadar çalışır. Diğer yandan, bir ileti runtime.sendNativeMessage kullanılarak gönderilen bir şey olduğunda, Chrome yeni bir her mesaj için yerel mesajlaşma ana makine sürecini destekler. Bu durumda, ana makine tarafından oluşturulan ilk mesaj işlem, orijinal isteğe yanıt olarak işlenir (ör. Chrome bunu yanıta iletir) runtime.sendNativeMessage çağrıldığında belirtilen geri çağırma. tarafından oluşturulan diğer tüm iletiler yerel mesajlaşma ana makinesi bu durumda yoksayılır.

Windows'da yerel mesajlaşma ana makinesine, tutma yeri içeren bir komut satırı bağımsız değişkeni de Chrome yerel penceresi çağrılıyor: --parent-window=<decimal handle value>. Bu sayede yerel reklamlar Mesajlaşma ana makinesi doğru üst öğeliğe sahip yerel kullanıcı arayüzü pencereleri oluşturur. Bu değerin Çağrı bağlamı bir arka plan komut dosyası sayfasıysa 0 değerini alır.

Yerel uygulamaya bağlanma

Yerel bir uygulamaya mesaj gönderip almak çapraz uzantıya çok benzer bahsedeceğim. Temel fark,runtime.connectNative runtime.connect ve runtime.sendNativeMessage, şunun yerine kullanılır: runtime.sendMessage. Bu yöntemler yalnızca "nativeMessaging" (yerel mesajlaşma) ve söz konusu izin uygulamanızın manifest dosyası olarak kaydedin.

Aşağıdaki örnek, yerel mesajlaşma ana makinesine bağlı bir runtime.Port nesnesi oluşturuyor com.my_company.my_application, bu bağlantı noktasından gelen mesajları dinlemeye başlar ve bir giden mesaj gönderir mesaj:

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, herhangi bir öğe oluşturulmadan yerel uygulamaya ileti göndermek için kullanılabilir bir bağlantı noktası, ör.:

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

Yerel mesajlaşmada hata ayıklama

Yerel mesajlaşma ana makinesi başlatılamazsa stderr adresine veya iletişim protokolüne dahil edilirse çıkış Chrome'un hata günlüğüne yazılır. Linux ve OS X'te bu günlük, kolayca erişilebilir. Bunun için Chrome'u komut satırından başlatıp terminal. Windows'da, Günlük kaydını etkinleştirme bölümünde açıklandığı şekilde --enable-logging politikasını kullanın.

Aşağıda, sorunların çözümüne ilişkin bazı hatalar ve ipuçları verilmiştir:

  • Yerel mesajlaşma ana makinesi başlatılamadı.
    • Dosyayı yürütmek için yeterli izinlere sahip olup olmadığınızı kontrol edin.
  • Geçersiz yerel mesajlaşma ana makine adı belirtildi.
    • Adın geçersiz karakter içerip içermediğini kontrol edin. Yalnızca küçük harfli alfanümerik karakterler, alt çizgi ve noktalara izin verilir. Ad noktayla başlayamaz veya bitemez ve nokta olamaz ve ardından başka bir nokta gelir.
  • Yerel ana makineden çıkıldı.
    • Yerel mesajlaşma ana makinesinin bağlantısı, mesaj Chrome tarafından okunmadan önce bozuldu. Bu, en çok büyük ihtimalle yerel mesajlaşma ana makinenizden başlatılır.
  • Belirtilen yerel mesajlaşma ana makinesi bulunamadı.
    • Ad, uzantıda ve manifest dosyasında doğru yazılmış mı?
    • Manifest doğru dizine ve doğru ada mı yerleştirildi? Yerel mesajlaşma ana makinesi bölümüne bakın konum bilgilerini girin.
    • Manifest dosyası doğru biçimde mi? Özellikle, JSON söz diziminin doğru olup olmadığını ve değerleri, yerel mesajlaşma ana makine manifestinin tanımıyla eşleşir mi?
    • path politikasında belirtilen dosya mevcut mu? Windows'da yollar göreli olabilir ancak OS X ve Linux'ta yollar mutlak olmalıdır.
  • Yerel mesajlaşma ana makinesi ana makine adı kayıtlı değil. (Yalnızca Windows)
  • Belirtilen yerel mesajlaşma ana makinesine erişim yasaklandı.
    • Uzantının kaynağı allowed_origins bölgesinde listeleniyor mu?
  • Yerel mesajlaşma ana makinesiyle iletişim kurulurken hata oluştu.
    • Bu çok yaygın bir hatadır ve iletişim protokolünün yanlış uygulandığını gösterir yerel mesajlaşma ana makinesinde çalışır.
    • stdout ürünündeki tüm çıkışların yerel mesajlaşma protokolüne uygun olduğundan emin olun. Şunu istiyorsanız: hata ayıklama amacıyla bazı verileri yazdırmak için stderr adresine yazın.
    • 32 bit mesaj uzunluğunun platformun yerel tam sayı biçiminde (küçük uçlu) olduğundan emin olun / büyük-endian).
    • Mesaj uzunluğu 1024*1024'ü geçmemelidir.
    • İleti boyutu, iletideki bayt sayısına eşit olmalıdır. Bu, "length" çünkü karakterler birden çok baytla temsil edilebilir.
    • Yalnızca Windows: Programın G/Ç modunun O_BINARY olarak ayarlandığından emin olun. Varsayılan olarak, G/Ç modu O_TEXT, bu durumda satır sonları (\n = 0A) yerine şununla değiştirilirken ileti biçimini bozar: Windows stili satır sonları (\r\n = 0D 0A). G/Ç modu __setmode ile ayarlanabilir.