Electron, contextIsolation and contextBridge



我最近不得不改造一个旧的电子应用程序。我发现它把contextIsolation设置为false,所以我继续把它设置为true(顺便把nodeIntegration设置为false)。

不出所料,它破坏了ipc通信

因此,我使用了许多地方建议的预加载脚本来启用一些通信通道

我的preload.js:

const {
contextBridge,
ipcRenderer
} = require("electron");
contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
console.log("Send on channel " + channel)
// whitelist channels
let validChannels = [];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
console.log("Receive on channel " + channel)
let validChannels = [
"set-auth-token",
"set-window-name",
"get-window-name",
"send-message-to-one-drive",
"update-badge",
"is-hidden",
"open-google-sign-in"
];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
}
);

我的问题是"api"参数,我不知道该放什么

知道该应用程序加载的网站以这种方式发送消息:

let electron = false;
if ('require' in window) {
electron = window.require('electron');
}
const isAppDesktop = !!electron;
const DesktopHelper = {
isAppDesktop() {
return isAppDesktop;
},
updateBadge(badgeCount) {
return isAppDesktop ? electron.ipcRenderer.send('update-badge', badgeCount) : undefined;
},
setAuthToken(token) {
return electron.ipcRenderer.send('set-auth-token', token);
},
isHidden() {
return isAppDesktop ? electron.ipcRenderer.sendSync('is-hidden') : undefined;
},
};
export default DesktopHelper;

有人能帮忙吗?

contextBridge.exposeInMainWorld(apiKey, api)-apiKey参数是将被公开为window[apiKey]的对象的名称。

在您的示例中,apiKey被设置为字符串"api",因此暴露的方法在window.api对象中可用。您可以访问它们作为window.api.sendwindow.api.receive

DesktopHelper中的方法应该是这样的:

updateBadge(badgeCount) {
return isAppDesktop ? window.api.send('update-badge', badgeCount) : 
undefined;
},

或者简单的api.send('update-badge', badgeCount),因为window是全局的。显然,您可能希望为API选择一个更具描述性的名称。

相关内容

  • 没有找到相关文章

最新更新