Android WebExtensions:如何向内容脚本发送消息?(安卓)

Android WebExtensions:如何向内容脚本发送消息?(安卓),android,google-chrome-extension,firefox-addon-webextensions,firefox-android,Android,Google Chrome Extension,Firefox Addon Webextensions,Firefox Android,我刚刚注意到tabs API不适用于Android。过去,我使用此代码向我的内容脚本发送消息: sendMsgToTabs(msg) { return browser.tabs.query({}).then(tabs => { let msgPromises = [] for (let tab of tabs) { let msgPromise = browser.tabs.sendMessage(tab.id, msg)

我刚刚注意到tabs API不适用于Android。过去,我使用此代码向我的内容脚本发送消息:

sendMsgToTabs(msg) {
    return browser.tabs.query({}).then(tabs => {
        let msgPromises = []
        for (let tab of tabs) {
            let msgPromise = browser.tabs.sendMessage(tab.id, msg)
            msgPromises.push(msgPromise)
        }
        return Promise.all(msgPromises)
    })
}
但是,当tabs API不可用时,我该怎么做呢?
我的意思是,我能想到的唯一一件事就是不断地从内容脚本向后台脚本发送空消息,每当后台脚本有新信息时,它就可以直接响应其中一条消息。但这听起来效率极低。一定有更好的方法,对吧?

从Firefox 54开始,使用 从Firefox54开始

Firefox 54之前的Firefox版本的替代方案。 Firefox for Android中声明支持。因此,虽然我还没有测试它,但您可以使用一种方法将数据发送到内容脚本,即使用保存值。通过侦听内容脚本中的事件,可以通知您正在存储/更改该数据。这将提供一种事件驱动的方式向内容脚本发送消息(即存储的数据)

为了区分在不同选项卡中接收数据,您需要为保存的数据的含义建立协议。这可以简单到只保存一个特定的键/值,这意味着所有内容脚本都应该向后台脚本发送一条消息以获取更多信息,或者在您发送/存储以下内容的地方更复杂:

{
    contentScriptMessage: {
        tab: 14,
        frame: 1234,
        message: 'Some data'
    }
}
在每个内容脚本的侦听器中,它可以忽略对运行它的选项卡/框架以外的任何更改

在您尝试实现此方法时,需要对其进行充实。希望在不久的将来,至少有一部分chrome.tabs
API将在Android上实现。

从Firefox 54开始,使用 从Firefox54开始

Firefox 54之前的Firefox版本的替代方案。 Firefox for Android中声明支持。因此,虽然我还没有测试它,但您可以使用一种方法将数据发送到内容脚本,即使用保存值。通过侦听内容脚本中的事件,可以通知您正在存储/更改该数据。这将提供一种事件驱动的方式向内容脚本发送消息(即存储的数据)

为了区分在不同选项卡中接收数据,您需要为保存的数据的含义建立协议。这可以简单到只保存一个特定的键/值,这意味着所有内容脚本都应该向后台脚本发送一条消息以获取更多信息,或者在您发送/存储以下内容的地方更复杂:

{
    contentScriptMessage: {
        tab: 14,
        frame: 1234,
        message: 'Some data'
    }
}
在每个内容脚本的侦听器中,它可以忽略对运行它的选项卡/框架以外的任何更改


在您尝试实现此方法时,需要对其进行充实。希望在不久的将来,至少有一部分
chrome.tabs
API将在Android上实现。

您可以使用内容脚本中的
browser.runtime.connect
和后台脚本中的
browser.runtime.onConnect
打开页面和后台页面之间的通道。将端口存储在列表中,并在触发
port.onDisconnect
事件时将其从列表中删除。您可以使用内容脚本中的
browser.runtime.connect
和后台脚本中的
browser.runtime.onConnect
打开页面和后台页面之间的通道。将端口存储在列表中,并在触发
port.onDisconnect
事件时将其从列表中删除。