浏览器扩展和本地应用之间的进程间通信

8
如何在浏览器扩展和本地应用程序之间建立进程间通信?是否有跨平台(Linux 和 Mac OS X)以及跨浏览器(Firefox、Chrome、Safari)的解决方案?
我能想到的唯一想法是使用本机 Web 技术,即在本地应用程序中嵌入 HTTP 服务器并使用 XmlHttpRequest 或 WebSockets。但这听起来很笨重,并带来了许多问题(例如安全性)。是否有更好的替代方案?

跨浏览器?可能不是。浏览器被设计用来与 Web 服务器通信,你想要更跨浏览器的解决方案,那么你拥有额外东西的可能性就越小。 - Xan
实际上,一段时间以前,NPAPI可能是一种方法,但至少在Chrome浏览器中,它已经完全被弃用了。 - Xan
通过“跨浏览器”,我指的是一种解决方案,即使“浏览器端”的实现不同,也可以让我拥有一个“协议”和一个“服务器”组件。 - el.pescado - нет войне
NPAPI在Firefox方面也已经被弃用了(嗯,有点)。addons.mozilla.org自相当长时间以来就不再接受NPAPI插件或包含此类插件的附加组件的提交。 - nmaier
1个回答

11

我认为最常用的方法是使用WebSocket连接。我能想到的两个例子是1Password和LiveReload(源代码可用)。

据我所知,您需要从全局页内打开WebSocket连接以避免跨域限制。

此外,在过去,我曾看到其他应用程序监视并修改扩展的设置文件。扩展只从自己的设置存储中读取和写入,而另一个进程会监视首选项文件以进行更改。我认为这种方法不太可靠,并且不符合Mac App Store的沙箱要求,因此我建议使用WebSocket方法。


能否在 AF_UNIX 套接字上运行 WebSockets 而不是 TCP? - el.pescado - нет войне
AF_UNIX 将排除 Windows(但您似乎只关注 Linux 和 OSX)... 然而,您甚至不能在 Chrome 扩展中使用 原始 TCP,只能使用 HTTP/XHR 和 WebSockets(在某种程度上)。您可以相对轻松地在 Firefox 中使用域套接字,尽管如此。 - nmaier
不必使用原始套接字。构建指向 Unix 域套接字而非 HTTP 主机的 WebSocket URI 就可以了。 - el.pescado - нет войне
1
@el.pescado:为什么你需要Unix域套接字?TCP回环作为传输方式不够好吗? - oberstet
1
@oberstet:Unix域套接字“生活”在文件系统上,这很方便,因为1)套接字可以在多用户系统中的用户主目录中“放置”,2)文件系统权限对它们进行强制执行。 - el.pescado - нет войне
我认为你关于UNIX套接字的问题应该单独提出一个问题。 - Xan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接