自从contextIsolation更改后,在电子渲染器过程中向web应用程序发送命令



我了解到contextIsolation更改是出于安全目的引入的,我了解到了contextBridge,它将自定义API公开给在渲染器进程中运行的web应用程序,以便web应用程序可以控制正在运行的电子应用程序。

电子预加载脚本

const contextBridge = require("electron").contextBridge;
contextBridge.exposeInMainWorld("electronApi", {
'doSomething' : function () {
// some code to execute
}
});

web应用

window.electronApi.doSomething();

这是非常清楚的,我理解为什么要这样做。

然而,我不明白通信如何以另一种方式工作,那么电子如何执行web应用程序命令呢?举个例子,web应用程序定义了window.someWebAppMethod,电子应该执行它

web应用

window.someWebAppMethod = function () {
// do somehing web app related
}

电子预加载脚本

window.someWebAppMethod()

^^这是不起作用的,因为contextsolation是contextsolation的全部意义,但我仍然需要有一种特定的方式来从electron触发web应用程序命令。最明显的原因是,假设我有电子主菜单,命令标记为";打开快速跳跃";它应该告诉在渲染过程中加载的web应用程序执行将显示";"快速跳跃";web应用程序的功能。

也许我错过了一些显而易见的痛苦,但我仍然很感激能得到的任何帮助。

感谢

我找到了一种方法。不确定它是否明显或是否足够安全,但它是:

电子预加载脚本

const contextBridge = require("electron").contextBridge;
let doSomethingInWebApp = null;
contextBridge.exposeInMainWorld("electronApi", {
'exposeDoSomethingInWebApp' : function (callback) {
doSomethingInWebApp = callback;
}
});

web应用

if (window.electronApi && window.electronApi.exposeDoSomethingInWebApp) {
window.electronApi.exposeDoSomethingInWebApp(function () {
// execute whatever you need to execute in webapp
});
}

电子预加载脚本

if (doSomethingInWebApp) {
// execute previously defined custom behavior in web app
doSomethingInWebApp();
}

所以它非常简单而且有效。

最新更新