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:
Ad | Açıklama |
---|---|
name | Yerel 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. |
description | Kısa uygulama açıklaması. |
path | Yerel 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. |
type | Yerel 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_origins | Yerel 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
- Google Chrome:
- 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
- Google Chrome:
- 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
- Google Chrome:
- 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
- Google Chrome:
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)
- Yerel mesajlaşma ana makinesi, Windows kayıt defterinde bulunamadı.
regedit
kullanarak tekrar kontrol edin anahtarın gerçekten oluşturulup oluşturulmadığını ve yerelleştirilen sayfada belgelenen gerekli biçimle eşleşip eşleşmediğini Mesajlaşma ana makine konumu.
- Yerel mesajlaşma ana makinesi, Windows kayıt defterinde bulunamadı.
- Belirtilen yerel mesajlaşma ana makinesine erişim yasaklandı.
- Uzantının kaynağı
allowed_origins
bölgesinde listeleniyor mu?
- Uzantının kaynağı
- 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çinstderr
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/Ç moduO_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.