Firefox Native Messaging runtime.LastError在Connectnative上未安装本机应用程序的情况下不提供任何错误

Firefox Native Messaging runtime.LastError在Connectnative上未安装本机应用程序的情况下不提供任何错误,firefox,firefox-addon,native,firefox-addon-webextensions,Firefox,Firefox Addon,Native,Firefox Addon Webextensions,我试图检查是否安装了本机应用程序,如果不是,我必须提示用户从网页下载。对于chrome,我通过检查runtime.LastError中的错误消息来实现。但是,对于Firefox,它只在控制台中给出错误,没有这样的本机应用程序扩展名,并且没有在runtime.LastError方法中捕获它 是否有任何方法可以确定是否安装了相应的本机应用程序? 当未安装本机应用程序且browser.runtime.lastError未给出任何错误时,我面临问题 您能否建议Firefox Webextension中是

我试图检查是否安装了本机应用程序,如果不是,我必须提示用户从网页下载。对于chrome,我通过检查runtime.LastError中的错误消息来实现。但是,对于Firefox,它只在控制台中给出错误,没有这样的本机应用程序扩展名,并且没有在runtime.LastError方法中捕获它

是否有任何方法可以确定是否安装了相应的本机应用程序? 当未安装本机应用程序且browser.runtime.lastError未给出任何错误时,我面临问题

您能否建议Firefox Webextension中是否有任何方法可以捕获此类错误,并在代码中识别它,无论用户计算机上是否安装了相应的本机应用程序

如果有人能提供一些这方面的信息,这将非常有帮助

例如:

startNativeApp: function(force){
        // note that when the native app is opened and ready, it will call "_ABC_onAgentReady"
        ABC.log('Starting native app.');
        if (!ABC.appConnected) {
            try {
                ABC.nativeAppPort = browser.runtime.connectNative(_ABC_native_app_id);
                ABC.nativeAppPort.onMessage.addListener(ABC.onNativeMessageReceived);
                ABC.nativeAppPort.onDisconnect.addListener(ABC.onNativeAppDisconnected);
                ABC.appInstalled = true;
                ABC.appConnected = true;
            } catch(e) {
                ABC.log('Error starting native app: ' + e.message, 'ERR');
            }
        } else if (force === true) {
            ABC.log('Native app is already running; attempting to stop and will restart in 750ms.');
            ABC.stopNativeApp();
            setTimeout(function() { ABC.startNativeApp(true); }, 750);
        }
},


onNativeAppDisconnected: function(message) {
        console.log("ABC LastError : "+browser.runtime.lastError);
        console.log("ABC LastError : "+ABC.nativeAppPort.error);
        console.log("ABC LastError : "+JSON.stringify(message));
        ABC.appConnected = false;
        ABC.nativeAppPort = null;
        ABC.appInstalled = false;
        if (browser.runtime.lastError && (browser.runtime.lastError.message.indexOf("No such native application") !== -1 )) {
            ABC.appInstalled = false;
        }
        // cleanup: reset the sig data so that it is re-requested on the next scan
        _ABC_sa_data = "";
        _ABC_sigs = "";
        if (browser.storage && browser.storage.local) {
            browser.storage.local.set({ uid: _ABC_be_uid }, null);
        }

        ABC.log('Send message to page to stop.');
        ABC.sendMessageToPage({ onNativeAppDisconnected: '' });
        ABC.log('Native app disconnected.');
    },

在Firefox中没有
运行时.lastError

传递给
runtime.Port.onDisconnect的侦听器函数未传递消息,而是传递给端口本身

然后您需要
端口错误


请参阅此处onDisconnect的文档

此处的问题是port.error在低于52的Firefox版本中没有给出任何错误响应,因此我在确定是否安装了本机应用程序时遇到了问题

在讨论Mozilla Community()之后,我们发现它实际上被遗漏了,并且已经报告了一个bug: 这将在Firefox52中解决

然而,我也需要支持Firefox50,所以我使用的另一种方法是调用本机应用程序,以了解它是否已安装

如果我得到的回应比它是安装,否则它不是。
但是,Firefox52将提供具体的错误消息。

请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。正如目前所写的,很难准确地说出你在问什么。请参阅页面以获取澄清此问题的帮助。当未安装本机主机或未完成注册表项时,如果我尝试将web扩展(js部分)连接到本机应用程序,则在web控制台中会出现错误,即“没有此类本机应用程序”,这是正确的,我想在我的js代码中检查是否安装了本机应用程序,是否有任何方法可以在响应或异常中获取消息?然后听起来我们需要的是查看您的代码。我的下一个评论将是对所需内容的简要描述。这听起来可能很多,但我们需要能够理解发生了什么,以及为什么您没有得到一些错误。虽然这通常是需要的,但让我们先在不使用本机应用程序的情况下尝试一下(或者选择一个通用的本机(不存在?)程序,它会产生相同的结果)。请选择主题中的问题:包括一个与问题重复的完整问题。包括manifest.json、一些后台/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么此代码不工作?”)必须包括:►想要的行为,►特定的问题或错误,以及►在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建”,以及。您是否尝试过使用
chrome.*
api而不是
browser.*