es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La aplicación nativa del complemento de Firefox se ejecuta solo una vez.

He publicado un complemento de mensajería nativa en Mozilla, pero el anfitrión de mensajería nativa (aplicación nativa) solo se ejecuta una vez, si reinicio Firefox, la aplicación nativa no se inicia.

Aquí está el escenario:

Paso 1: Instalo la aplicación nativa en Windows 10 utilizando el archivo de instalación, la configuración también establece la clave del registro en
HKEY_CURRENT_USER\Software\Mozilla\NativeMessagingHosts
HKEY_LOCAL_MACHINE\Software\Mozilla\NativeMessagingHosts

Paso 2: Inicio Firefox, descargo e instalo el complemento publicado (firmado) desde Mozilla. El icono del complemento aparece en Firefox, hago clic en el icono, aparece la página emergente del complemento, hago clic en los elementos del menú en la página emergente, el complemento funciona como se espera, la aplicación nativa también funciona, recibe mensajes del complemento y envía mensajes de vuelta al complemento.

Todo está bien, parece que el complemento de mensajería nativa funciona bien. Sin embargo, después de reiniciar Firefox, al hacer clic en el icono del complemento, al hacer clic en los elementos del menú en el menú emergente, no sucede nada. Escribo about:debugging en la ventana de la consola y aparece el mensaje de error “Unchecked lastError value: Error: port is null”.

Este error solo ocurre al usar el complemento firmado, al usar una versión local no firmada del complemento, el anfitrión de mensajería nativa y el complemento siempre se ejecutan, no hay tal problema.

Quiero saber si al descargar e instalar el complemento desde Mozilla, además del archivo XPI del complemento, también se descargan otros archivos. Tal vez estos otros archivos se ejecuten después de reiniciar Firefox y estos archivos o su configuración impidan la ejecución de la aplicación nativa.

Aquí está el fragmento de código en la página de fondo:

function connectToNativeHost()
{
   var nativeHostName = “com.some-company.test”;
   port = chrome.runtime.connectNative(nativeHostName);
   console.log(port)
}

port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);

function onDisconnected()
{
   console.log(chrome.runtime.lastError);
   console.log('desconectado de la aplicación nativa.');
   port = null;
}

Pruebo una y otra vez y descubro que después de reiniciar Firefox, la aplicación nativa nunca se ejecuta nuevamente, Firefox no crea un proceso para la aplicación nativa.

¡Gracias por su ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es posible que la aplicación nativa no esté correctamente registrada en Firefox después de reiniciar. Una forma de asegurarse de que la aplicación nativa esté siempre registrada es incluir la configuración de la clave del registro en el propio complemento.

    Puede agregar un script de fondo al complemento que se ejecutará al iniciar y registrará la aplicación nativa. Aquí tienes un ejemplo de fragmento de código:

    chrome.runtime.onStartup.addListener(function() {
       var manifest = chrome.runtime.getManifest();
       var nativeAppName = manifest.nativeMessaging.hosts.nativeHostName;
       var nativeAppPath = "C:\\ruta\\a\\la\\aplicacionNativa.exe"; // cambia esto por la ruta real de tu aplicación nativa
    
       var regKey = "HKEY_CURRENT_USER\\Software\\Mozilla\\NativeMessagingHosts\\" + nativeAppName;
       var regValue = nativeAppPath.replace(/\\/g, "\\\\");
    
       chrome.management.getSelf(function(self) {
          if (self.installType == "development") {
             console.log("Registro de la aplicación nativa omitido en modo de desarrollo.");
          } else {
             var command = "reg add \"" + regKey + "\" /ve /t REG_SZ /d \"" + regValue + "\" /f";
             chrome.runtime.sendNativeMessage(nativeAppName, {cmd: command}, function(response) {
                if (chrome.runtime.lastError) {
                   console.error("Error en el registro de la aplicación nativa:", chrome.runtime.lastError.message);
                } else {
                   console.log("Aplicación nativa registrada:", nativeAppName);
                }
             });
          }
       });
    });
    

    Este código verificará el manifiesto del complemento para obtener el nombre y la ruta de la aplicación nativa. Luego construirá una ruta y un valor de clave de registro en base a esta información. Finalmente, utilizará la función chrome.runtime.sendNativeMessage() para ejecutar un comando reg add y registrar la aplicación nativa.

    Ten en cuenta que este código solo debe usarse en modo de producción y debe omitirse en modo de desarrollo. Esto se debe a que Firefox puede estar ejecutándose en un entorno en sandbox durante el desarrollo, lo cual puede evitar que la configuración de la clave del registro funcione.

    Espero que esto te ayude a resolver el problema con tu complemento de mensajería nativa.

Comments are closed.