我最近不得不改造一个旧的电子应用程序。我发现它把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.send
和window.api.receive
。
DesktopHelper
中的方法应该是这样的:
updateBadge(badgeCount) {
return isAppDesktop ? window.api.send('update-badge', badgeCount) :
undefined;
},
或者简单的api.send('update-badge', badgeCount)
,因为window是全局的。显然,您可能希望为API选择一个更具描述性的名称。