Uzantılar, diğer mesaj iletme API'lerine benzer bir API kullanarak yerel uygulamalarla mesaj alışverişi yapabilir. Bu özelliği destekleyen yerel uygulamalar, uzantıyla iletişim kurabilen bir yerel mesajlaşma ana makinesi kaydetmelidir. Chrome, ana makineyi ayrı bir işlemde başlatır ve standart giriş ve standart çıkış akışlarını kullanarak ana makineyle iletişim kurar.
Yerel mesajlaşma ana makinesi
Yerel mesajlaşma ana makinesini kaydetmek için uygulamanın, yerel mesajlaşma ana makinesi yapılandırmasını tanımlayan bir dosya kaydetmesi gerekir.
Dosya örneği aşağıdaki gibidir:
{
"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 makinesi manifest dosyası geçerli bir JSON olmalı ve aşağıdaki alanları içermelidir:
name- Yerel mesajlaşma ana makinesinin adı. İstemciler bu dizeyi
runtime.connectNative()veyaruntime.sendNativeMessage()'a iletir. Bu ad yalnızca küçük harf, alfanümerik karakter, alt çizgi ve nokta içerebilir. Ad nokta ile başlayamaz veya bitemez ve noktadan sonra başka bir nokta gelemez. description- Kısa uygulama açıklaması.
path- Yerel mesajlaşma ana makinesi ikilisine giden yol. Linux ve macOS'te yol mutlak olmalıdır. Windows'da, manifesto dosyasını içeren dizine göreli olabilir. Ana makine işlemi, geçerli dizin ana makine ikilisini içeren dizin olarak ayarlanmış şekilde başlatılır. Örneğin, bu parametre
C:\Application\nm_host.exeolarak ayarlanırsa geçerli dizin olan "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ü. Bu parametrenin olası tek değeri
stdio'dır. Bu, Chrome'un ana makineyle iletişim kurmak içinstdinvestdoutkullanması gerektiğini gösterir. allowed_origins- Yerel mesajlaşma ana makinesine erişmesi gereken uzantıların listesi.
allowed_originsdeğerleri joker karakter içeremez.
Yerel mesajlaşma ana makinesinin konumu
Manifest dosyasının konumu platforma bağlıdır.
Windows'da manifest dosyası, dosya sisteminde herhangi bir yerde bulunabilir. Uygulama yükleyicisi, 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 kayıt defteri anahtarı oluşturmalı ve bu anahtarın varsayılan değerini manifest dosyasının tam yolu olarak ayarlamalıdır. Örneğin, aşağıdaki komutu kullanma:
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 aşağıdaki .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 ararken önce 32 bit kayıt defteri, ardından 64 bit kayıt defteri sorgulanır.
macOS ve Linux'ta yerel mesajlaşma ana makinesinin manifest dosyasının konumu tarayıcıya (Google Chrome, Google Chrome for Testing veya Chromium) göre değişir. Sistem genelinde yerel mesajlaşma barındırıcıları sabit bir konumda aranırken kullanıcı düzeyinde yerel mesajlaşma barındırıcıları kullanıcı profili dizininin NativeMessagingHosts/ alt dizininde aranır.
- macOS (sistem genelinde)
- Google Chrome:
/Library/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json - Google Chrome for Testing:
/Library/Google/ChromeForTesting/NativeMessagingHosts/com.my_company.my_application.json - Chromium:
/Library/Application Support/Chromium/NativeMessagingHosts/com.my_company.my_application.json - macOS (kullanıcıya özel, varsayılan yol)
- Google Chrome:
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.my_company.my_application.json - Google Chrome for Testing:
~/Library/Application Support/Google/ChromeForTesting/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 - Google Chrome for Testing:
/etc/opt/chrome_for_testing/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 - Google Chrome for Testing:
~/.config/google-chrome-for-testing/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) kullanarak ana makineyle iletişim kurar. İletileri her iki yönde de göndermek için aynı biçim kullanılır. Her ileti, JSON kullanılarak serileştirilir, UTF-8 ile kodlanır ve yerel bayt sırasındaki 32 bitlik ileti uzunluğuyla başlar. Yerel mesajlaşma ana makinesinden gelen tek bir iletinin maksimum boyutu 1 MB'tır. Bunun temel nedeni, Chrome'u hatalı çalışan yerel uygulamalardan korumaktır. Yerel mesajlaşma ana makinesine gönderilen iletinin maksimum boyutu 64 MiB'dir.
Yerel mesajlaşma ana makinesine iletilen ilk bağımsız değişken, arayanın kaynağıdır ve genellikle chrome-extension://[ID of allowed extension] olur. Bu, yerel mesajlaşma ana makinesi manifestosundaki allowed_origins anahtarında birden fazla uzantı belirtildiğinde yerel mesajlaşma ana makinelerinin iletinin kaynağını tanımlamasına olanak tanır.
Windows'da, yerel mesajlaşma ana makinesine, çağıran Chrome yerel penceresinin tutamacını içeren bir komut satırı bağımsız değişkeni de iletilir: --parent-window=<decimal handle value>. Bu, yerel mesajlaşma ana makinesinin doğru şekilde üst öğe atanmış yerel kullanıcı arayüzü pencereleri oluşturmasına olanak tanır. Çağrı bağlamı bir hizmet çalışanıysa bu değerin 0 olacağını unutmayın.
runtime.connectNative() kullanılarak bir mesajlaşma bağlantı noktası oluşturulduğunda Chrome, yerel mesajlaşma ana makine sürecini başlatır ve bağlantı noktası yok edilene kadar bu süreci çalışır durumda tutar. Diğer taraftan, runtime.sendNativeMessage() kullanılarak mesajlaşma bağlantı noktası oluşturulmadan bir mesaj gönderildiğinde Chrome, her mesaj için yeni bir yerel mesajlaşma ana makine işlemi başlatır. Bu durumda, ana makine süreci tarafından oluşturulan ilk mesaj, orijinal isteğe yanıt olarak işlenir ve Chrome, runtime.sendNativeMessage() çağrıldığında belirtilen yanıt geri çağırmasına iletir. Bu durumda, yerel mesajlaşma ana makinesi tarafından oluşturulan diğer tüm mesajlar yoksayılır.
Yerel bir uygulamaya bağlanma
Yerel bir uygulamaya mesaj gönderme ve bu uygulamadan mesaj alma, uzantılar arası mesajlaşmaya çok benzer. Temel fark, runtime.connect() yerine runtime.connectNative(), runtime.sendMessage() yerine ise runtime.sendNativeMessage() kullanılmasıdır.
Bu yöntemleri kullanmak için uzantınızın manifest dosyasında "nativeMessaging" izni bildirilmelidir.
Bu yöntemler içerik komut dosyalarında değil, yalnızca uzantınızın sayfalarında ve hizmet çalışanında kullanılabilir. Bir içerik komut dosyasından yerel uygulamaya iletişim kurmak için mesajı, yerel uygulamaya iletmesi amacıyla hizmet çalışanıza gönderin.
Aşağıdaki örnek, yerel mesajlaşma ana makinesi com.my_company.my_application'e bağlı bir runtime.Port nesnesi oluşturur, bu bağlantı noktasından gelen mesajları dinlemeye başlar ve bir giden mesaj gönderir:
const port = chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener((msg) => {
console.log('Received', msg);
});
port.onDisconnect.addListener(() => {
if (chrome.runtime.lastError) {
console.error(
'Disconnected due to error:',
chrome.runtime.lastError.message
);
} else {
console.log('Disconnected');
}
});
port.postMessage({text: 'Hello, my_application'});
Bağlantı noktası oluşturmadan yerel uygulamaya mesaj göndermek için runtime.sendNativeMessage kullanın. Örneğin:
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
(response) => {
if (chrome.runtime.lastError) {
console.error(
'Error sending native message:',
chrome.runtime.lastError.message
);
return;
}
console.log('Received', response);
}
);
Yerel mesajlaşmada hata ayıklama
Yerel mesajlaşma hataları oluştuğunda teşhis çıkışı Chrome'un hata günlüğüne yazılır.
Linux ve macOS
# Linux
google-chrome --enable-logging=stderr --log-level=1 2>&1 | \
grep -E "native_messag|launch_context"
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--enable-logging=stderr --log-level=1 2>&1 | \
grep -E "native_messag|launch_context"
Windows
Günlük kaydı etkinleştirilmiş olarak Chrome'u başlatın:
chrome.exe --enable-logging --log-level=1
Mevcut bir Chrome işlemine bağlanmadan ayrı bir örnek başlatmak için --user-data-dir="%TEMP%\nm-debug" iletin.
Çıkışı görüntülemek için PowerShell'i kullanarak chrome_debug.log yayınlayın:
$log = "$env:LOCALAPPDATA\Google\Chrome\User Data\chrome_debug.log"
Get-Content -Wait $log | Select-String "native_messag|launch_context"
Ayrıca, chrome_debug.log dosyasını bir metin düzenleyicide açıp launch_context.cc veya native_message_process_host.cc öğesini de arayabilirsiniz.
Tuş vuruşu günlüğü ayrıntıları
launch_context.cciçindeki manifest arama ve ayrıştırma hataları uyarı olarak kaydedilir. Bu başlangıç teşhislerini bastıran2(HATA) yerine--log-level=1kullanın.- Manifest ve ikili başlatma hatalarını bulmak için
launch_context, yük boyutu ve kanal iletişimi hatalarını bulmak içinnative_messagifadesini arayın.
Sık karşılaşılan hatalar
Sık karşılaşılan bazı hatalar ve bunları çözmeye yönelik ipuçları aşağıda verilmiştir:
Yerel mesajlaşma ana makinesi başlatılamadı.
Yerel mesajlaşma ana makine dosyasını çalıştırmak için yeterli izniniz olup olmadığını kontrol edin.
Geçersiz yerel mesajlaşma ana makine adı belirtildi.
Adın geçersiz karakterler içerip içermediğini kontrol edin. Yalnızca küçük alfanümerik karakterlere, alt çizgilere ve noktalara izin verilir. Ad nokta ile başlayamaz veya bitemez ve bir noktadan sonra başka bir nokta gelemez.
Yerel düzenleyen çıktı.
İleti, Chrome tarafından okunmadan önce yerel mesajlaşma ana makinesine giden kanal bozuldu. Bu durum büyük olasılıkla yerel mesajlaşma ana makinenizden başlatılmıştır.
Belirtilen yerel mesajlaşma ana makinesi bulunamadı.
Aşağıdakileri kontrol edin:
- Uzantıda ve manifesto dosyasında ad doğru yazılmış mı?
- Windows'da kayıt defteri anahtarı
HKEY_CURRENT_USERveyaHKEY_LOCAL_MACHINEaltında mevcut mu ve varsayılan değeri tam manifest yolunu mu gösteriyor? Chrome önce 32 bit kayıt görünümünü, ardından 64 bit görünümünü sorgular. Anahtarı doğrulamak içinregedittuşunu kullanın. Yerel mesajlaşma ana makinesinin konumuna bakın. - macOS ve Linux'ta, manifest dosyası beklenen dizinde mi bulunuyor ve ana makineye göre mi adlandırılıyor (ör.
com.my_company.my_application.json)? Yerel mesajlaşma ana makine konumu başlıklı makaleye bakın. - Manifest dosyası doğru biçimde mi? Özellikle JSON geçerli ve iyi biçimlendirilmiş mi? Değerler, yerel mesajlaşma ana makinesi manifestinin tanımına uygun mu?
pathiçinde belirtilen dosya var mı? Windows'da yollar göreceli olabilir ancak macOS ve Linux'ta yollar mutlak olmalıdır.
Belirtilen yerel mesajlaşma ana makinesine erişim yasaktır.
Uzantının kaynağı allowed_origins içinde listeleniyor mu?
Yerel mesajlaşma ana makinesiyle iletişim kurulurken hata oluştu.
Bu, yerel mesajlaşma ana makinesinde iletişim protokolünün yanlış uygulandığını gösterir.
stdoutiçindeki tüm çıkışların yerel mesajlaşma protokolüne uygun olduğundan emin olun. Hata ayıklama amacıyla bazı verileri yazdırmak istiyorsanızstderradresine yazın.- 32 bitlik ileti uzunluğunun, platformun yerel tam sayı biçiminde (little-endian/big-endian) olduğundan emin olun.
- İleti uzunluğu 1024*1024'ü aşmamalıdır.
- İleti boyutu, iletideki bayt sayısına eşit olmalıdır. Bu değer, karakterler birden fazla baytla temsil edilebileceğinden dizenin "uzunluğundan" farklı olabilir.
- Yalnızca Windows: Programın G/Ç modunun
O_BINARYolarak ayarlandığından emin olun. Varsayılan olarak, I/O moduO_TEXTşeklindedir. Bu modda, satır sonları (\n=0A) Windows tarzı satır sonlarıyla (\r\n=0D 0A) değiştirildiğinden ileti biçimi bozulur. I/O modu,__setmodekullanılarak ayarlanabilir.