使用chrome.runtime.sendmessage从网页到打包的应用程序进行通信

Cri*_*ens 1 google-chrome google-chrome-app

我正在尝试从网页到打包的应用程序进行通信.想法是让网页从串行设备读取数字.因为我想访问串行设备,我需要一个打包的应用程序,不能使用扩展.这与Keep Chrome Packaged App在后台运行非常相似似乎Chrome文档说这是可能的.

如何从常规网页执行chrome.runtime.sendMessage?当我这样做时,我得到*Uncaught TypeError:无法读取未定义的属性'sendMessage'.我的简单功能是:

function doFunction(){
    chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
      function(response) {
        if (!response.success)
          handleError(url);
      });
}
Run Code Online (Sandbox Code Playgroud)

我的打包应用程序加载并可以访问串行端口.但我的怀疑是清单不是"启用"常规网页的chrome.runtime.manifest.json的:

{
  "name": "Hello World!",
  "description": "My first Chrome App.",
  "version": "0.1",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": { "16": "calculator-16.png", "128": "calculator-128.png" },
  "permissions": [
    "serial",
    "*://localhost/*"
  ],
  "externally_connectable": {
  "matches": [
      "*://localhost/*"]
}
}
Run Code Online (Sandbox Code Playgroud)

也许它是:// localhost /我正在用于测试.但Chrome并没有抱怨.

有什么想法吗?提前致谢.

Cri*_*ens 7

Xan的评论起到了作用.

虽然Chrome没有抱怨*://localhost/*,但它没有用.Chrome确实抱怨其他组合如file://localhost/.

我将foo.com添加到主机文件,然后通过Web服务器提供我的网页,它工作正常!我可以从我的网页与我的打包应用程序进行通信.

请注意,浏览到file://www.foo.com/hostpage.html不起作用.但浏览http://www.foo.com:3000/hostpage.html确实如此.(我正在使用Rails,因此是3000端口).

故事的故事:在本地测试时,您需要在主机文件中添加一个伪造的二级域名条目.

这是我的manifest.json:

{
  "name": "RFID Tag Reader",
  "description": "Reads RFID Tags connected via USB reader",
  "version": "0.0.0.1",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": {
    "16": "rfid-16.png",
    "128": "rfid-128.png"
  },
  "permissions": [
    "serial",
    "*://www.foo.com/*",
    "*://arealsite.net/*"
  ],
  "externally_connectable": {
    "matches": [
      "*://www.foo.com/*",
      "*://arealsite.net/*"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 在“externally_connectable”中添加“*://localhost/*”作为“匹配”也对我有用(Chrome 86.0.4240.111) (2认同)