Chrome 应用程序中的清单文件可以是动态的吗?

Can the manifest file be dynamic in Chrome Apps?

我正在编写一个 Chrome 与网页通信的应用程序。为此,我在清单文件中添加了类似的内容。

"externally_connectable": {
  "matches": ["*://*.example.com/*"]
}

但是 "example.com" 必须是动态的,因为每个客户都有自己的一个 Web 服务器。

有没有可能,用户(安装应用程序的人)可以更改 externally_connectable site/s。

据我所知,"externally_connectable" 是从提到的网页发送消息(带数据)的唯一官方方式 here

这需要为每个域预定义值。但是如果你只想做一个扩展来接受来自任何网页的消息怎么办?

如果你只是想通知另一方一些事情,你可以使用本机 JS Event 从一侧在 document 上调度它并在 document 上收听它同样来自另一端,因为 document 在扩展 content script 页面和网页之间共享。

您不能使用 JS CustomEvent 发送数据,因为每次发送数据时,由于 sandbox 任何扩展的影响,您收到的数据都是空的。

如果你想共享数据,那么到目前为止我知道的唯一解决方法——在花了大约一个月的时间开发一个扩展之后——是在某种存储和 JS 本机事件机制之间进行组合.

解决步骤(假设您需要网页向扩展程序发送一些数据):

  1. 通过网页在 document 上举办活动。
  2. 将数据临时保存在您喜欢的任何存储技术中 (localStorage,DOM 本身,或者其他什么……)
  3. 通过监听在另一端(分机)接收事件 document.
  4. 读取数据并将其删除。

希望这对某人有所帮助,或者打开一扇门来讨论更好的方法。

还有一种网页可以通过内容脚本与扩展程序通信的替代方法。如果网页和扩展都由您完成,则可以使用此方法。

例如

web page <--> content script of extension <--> background script of extension <--> native application

对于网页内容脚本的扩展通讯使用window.postMessagewindow.addEventListener

对于GoogleChrome浏览器,

对于扩展的内容脚本到扩展通信的后台脚本使用chrome.runtime.sendMessagechrome.runtime.onMessage.addListener

对于本机应用程序通信扩展的后台脚本使用chrome.runtime.sendNativeMessage

请确保您的代码具有必要的安全性。