【问题标题】:chrome extension cannot send message after extension reload扩展重新加载后chrome扩展无法发送消息
【发布时间】:2015-05-18 16:52:12
【问题描述】:

我目前正在开发一个主要由 JS 应用程序驱动的 chrome 扩展。 在我重新加载扩展之前,我可以使用长期连接在应用程序和后台页面之间发送消息。 一旦重新加载,就无法连接到它(从内容脚本或使用扩展 ID 的 JS 代码)。它一直说“尝试使用断开连接的端口对象”。 我尝试切换到一次性请求模型,但没有成功。重新加载扩展后,调用 sendMessage 回调时不带参数,扩展不会收到任何消息。 我遵循了此解决方案中的提示: chrome.runtime.sendMessage throws exception from content script after reloading Chrome Extension 但这并没有改变任何东西。

我错过了什么?

编辑:

这是我设置连接的方式:

var port = chrome.runtime.connect()
// Then I use a DOM message to communicate with content-script :
window.addEventListener("message", function(message) {
    port.postMessage(message);
}

【问题讨论】:

  • 您能告诉我们您是如何设置初始连接的吗?
  • 您链接到的解决方案在为我自己测试后似乎工作正常

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

你不会错过任何东西。这就是它目前的工作方式。我也不喜欢。这很常见,因为它发生在 chrome 自动更新扩展程序时,即使在使用时也是如此。
我在我的扩展中通过检测您提到的特定错误来处理这个问题。然后每个内容页面都会显示一个小的无模块对话框,告诉用户忽略或重新加载网页。 Plus for Trello chrome extension 从 2 天前开始执行此操作。虽然它不是很好,但我借此机会使用无模组对话框中的链接向用户介绍新功能。
另外,如果您想在后台捕获它,只需解析您的清单(作为资源公开)并将最后一个版本保存在本地存储中。您会发现它已更新。还有 onUpdated 但我从未使用过它。
我想如果你真的必须从内容到新扩展进行通信,你可以在一个固定的 storage.local 属性中写一条消息。后台注册存储更改并通过读取该存储并在处理后将其删除来检测未决消息。除非您还使用本地存储进行回复并在内容端进行相同的观看,否则无法回复。

【讨论】:

  • 遗憾的是,在我的情况下,重新加载页面还不够。我需要删除并重新安装整个扩展。可悲的是,我使用扩展来存储我的应用程序状态...... :(
  • 那是需要进一步解释的东西。你为什么要这样?您将失去 99.9% 的用户,我认为这样做没有技术原因。
  • 使用扩展程序使我能够使用无限存储空间。失去我的用户不是问题,它是一个内部应用程序,将部署在用户的 chromebook 上。这就是为什么每次决定停止工作时不必重新部署扩展程序对我来说至关重要的原因:)
  • 这仍然无法解释为什么您必须删除并重新安装扩展程序。另请参阅我的更新答案
  • 我看到了你的回答,谢谢。但它不会发生在自动更新上,因为我现在不更新我的扩展,我仍处于开发阶段。只需激活“允许隐身”或重新加载应用程序就会中断与扩展程序的通信。除了删除/重新安装扩展程序以使其再次工作之外,没有其他方法可以重新启用通信。我试图在内容脚本注入中删除现有的事件处理程序,但它没有改变任何东西。
【解决方案2】:

跟进这个问题: 我的后台页面代码中似乎存在阻止调用 chrome.runtime.onConnect 的问题。我修复了它,它现在可以工作了。

【讨论】:

  • 你做了什么来修复它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多