0

我刚刚注意到选项卡 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不可用时,我应该如何做?
我的意思是我唯一能想到的就是不断地从内容脚本向后台脚本发送空消息,并且每当后台脚本有新信息时,它就可以对这些消息之一发送直接响应。但这听起来非常低效。应该有更好的方法吧?

4

1 回答 1

2

从 Firefox 54 开始,使用.tabs.sendMessage()

从 Firefox 54 开始,该tabsAPI 在 Firefox for Android 上受支持

Firefox 54 之前的 Firefox 版本的替代方案。

storageAPI在 Firefox for Android 中被声明为支持。因此,虽然我没有对其进行测试,但您可以用来将数据发送到内容脚本的一种方法是使用chrome.storage.local.set(). 通过收听chrome.storage.onChanged内容脚本中的事件,您可以收到有关数据正在存储/更改的通知。这将提供一种事件驱动的方式来向内容脚本发送消息(即存储的数据)。

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

{
    contentScriptMessage: {
        tab: 14,
        frame: 1234,
        message: 'Some data'
    }
}

然后,在每个内容脚本的chrome.storage.onChanged侦听器中,它可以忽略不对其运行的选项卡/框架的任何更改。

当您尝试实施此方法时,需要对其进行充实。希望至少部分chrome.tabsAPI 将在不久的将来为 Android 实现。

于 2017-01-24T18:40:34.107 回答