【问题标题】:WebExtensions: How to send a message to content script? (Android)WebExtensions:如何向内容脚本发送消息? (安卓)
【发布时间】:2017-07-28 11:10:24
【问题描述】:

我刚刚注意到选项卡 API 是 only available for the desktop 不适用于 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)
    })
}

但是当标签 API 不可用时,我应该怎么做呢?
我的意思是我能想到的唯一一件事就是不断地从内容脚本向后台脚本发送空消息,并且每当后台脚本有新信息时,它就可以对这些消息之一发送直接响应。但这听起来非常低效。一定有更好的办法吧?

【问题讨论】:

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

标签: android google-chrome-extension firefox-addon-webextensions firefox-android


【解决方案1】:

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

从 Firefox 54 开始,tabs APIis supported on Firefox for Android

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2020-10-12
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多