将内容 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 来固定它以获取更多详细信息。
所以我一直在尝试将数据从网页发送到 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 来固定它以获取更多详细信息。