Chrome background.js 中的扩展程序 onMessage.addListener 未被调用

Chrome Extension onMessage.addListener in background.js not being called

我希望能够从内容脚本(任何选项卡)背景[=48]进行交流=].

根据文档,我应该使用 chrome.extension chrome.runtime.onMessagechrome.runtime.sendMessage.

我就是这么做的:

manifest.json

"background": {
  "scripts": ["background.js"],
  "persistent": false
},
"permissions": [
  "*://*/*"
],

background.js

console.info('1');
chrome.runtime.onMessage.addListener((request, sender, sendReponse) => {
  console.info('2');
  sendReponse({ msg: 'foo' });
  return true;
});

我不太确定return true; is needed。我试过有和没有。

构建并重新加载扩展程序后,我通过 chrome://extensions

访问了 chrome 后台页面
> 1 // background.js file was run
> chrome.runtime.sendMessage({ hello: 'so' }, v => console.info(v))
> undefined
> undefined // This is the callback response I get. Why?

更重要的是,当 运行 来自其他选项卡(即 whosebug.com)

的 sendMessage 时,我也得到一个空响应回调
> chrome.runtime.sendMessage('extension id', { hello: 'so' }, v => console.info(v))
> undefined
> undefined

为什么我得到一个空响应回调?

我是否缺少任何特殊许可?参数错误?这样做的 API 函数可能是错误的?

  1. runtime.sendMessage doesn't send the message to the sender's context since Chrome 49.

    If sending to your extension, the runtime.onMessage event will be fired in every frame of your extension (except for the sender's frame),

  2. 网页可以在两种情况下向您的 background/event 页面发送消息:

    • externally_connectable 键入 manifest.json 允许该页面
    • 为该页面加载了您的扩展程序的内容脚本,在这种情况下,您可以在控制台工具栏中将上下文切换到您的扩展程序,以便能够从控制台手动发送消息:

      内容脚本可以在 manifest.json 中声明,在这种情况下,它会通过 [重新] 加载页面自动注入。或者您可以使用 background/event 页面中的 tabs.executeScript 显式注入它。