将内容 scripts/messaging 与 Chrome 应用程序(非扩展)一起使用来发送数据

Using content scripts/messaging with Chrome Apps (not extension) to send data

所以我一直在尝试将数据从网页发送到 Chrome 应用程序(而不是 Chrome 扩展程序)。根据我的说法,阅读周围的东西,这主要需要使用 url_handlers for invoking Chrome App from a web page, content scripts to inject JS into the web page and/or Messaging 在 Chrome 应用程序和网页之间进行通信。

此外,从 .crx 安装应用程序,否则加载解压目录会导致此错误:

"content_scripts is only allowed for extensions and legacy packaged apps, but this is a packaged app."

现在,我尝试在需要的站点注入JS。但是,在使用 Chrome 开发工具进行检查时,该站点的 Sources->Content scripts 部分中没有此类条目。它在使用 Chrome 应用程序时根本没有注入自己。它与扩展程序完美配合,但我想使用 Chrome 应用程序来实现其他功能。

作为替代方案,我查找了 Messaging 示例,其中提到了它的用法:

"... your app or extension can receive and respond to messages from regular web pages."

但是,不知何故我无法让它工作。
任何一种方法都有 headers 吗?其他建议?

manifest.json:

{
  "name": "App",
  "version": "1.0",
  "manifest_version": 2,
  "minimum_chrome_version": "31",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    {"fileSystem": ["write", "retainEntries", "directory"]},
    "storage",
    "http://example.com/*"
  ],
  "externally_connectable": {
    "matches": ["http://example.com/*"]
  },
  "content_scripts": [{
    "matches": ["http://example.com/*"],
    "js": ["content.js"]
  }]
}

事实上,您不能在应用程序中包含内容脚本。

然而,using externally_connectable是有效的。

您已经声明要从 example.com 进行外部连接。 (注意:定义匹配模式时要小心,例如这个不包括 www.example.com

example.com 自己的脚本中,您可以包含以下内容:

chrome.runtime.sendMessage("idOfYourAppHere", message, function(response) {
  /* ... */
});

在应用程序(可能是它的后台脚本)中,您可以使用

chrome.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) {
  /* ... */
  sendResponse(response); 
});

确实要求您提前知道 ID。您可以通过打包您的扩展并提取 "key" field from the manifest. See this question 来固定它以获取更多详细信息。