我想要实现的是“真正的”应用程序般的行为,当我在MacOS上关闭应用程序时(点击X,所以应用程序仍处于停靠状态)然后再次从Dock中打开应用程序,网页内容应立即在那里。当我正在尝试为Web应用程序构建容器时,我得到的行为是,每次打开应用程序时,网页都会再次加载,从而导致UX中出现摩擦。
我已经尝试了一些肮脏的解决方法,比如在卸载窗口之前从渲染器进程调用主窗口上的.hide():
const {remote} = require('electron');
const main = remote.require('./main.js');
window.onbeforeunload = e => {
main.hideWindow();
e.returnValue = false;
};
并在主要流程中
exports.hideWindow = () => {
mainWindow.hide();
};
但是那样我根本不能退出我的应用程序。
我考虑的另一个选项是将整个mainWindow DOM加载到内存中,然后在打开应用程序时,在<webview>
preload script中将缓存的内容加载到webview中,一旦页面加载,覆盖webview内容,但它似乎也非常hackish。
我知道Slack的行为与我希望我的应用程序的行为完全一致,但我很难找到他们如何实现即时加载(或者可能永远不会关闭,除非从Dock中选择Quit或者Cmd + Q是命中)。
答案 0 :(得分:0)
如果我正确理解您的问题,那么我认为有一些标准的解决方法。具体围绕
......永远不会关闭,除非从Dock中选择退出或 Cmd + Q被击中)
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit()
}
})
而且......
再次从Dock中打开应用程序,网页内容应该在那里 立即
app.on('activate', () => {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
createWindow()
}
})
答案 1 :(得分:0)
我最终得到了一个旗帜,用于管理&#34;关闭&#34;行为
let allowQuitting = false;
并像这样处理结束
function quitApp() {
if (app) {
allowQuitting = true;
app.quit();
}
}
function closeApp() {
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.hide();
}
}
关闭时,我会听取结束事件
function createWindow() {
mainWindow.on('closed', function () {
closeApp();
});
mainWindow.on('close', event => {
if (allowQuitting === false) {
event.preventDefault();
closeApp();
}
});
...
}
app.on('ready', createWindow);
在激活时,我首先检查窗口是否存在
app.on('activate', function () {
if (mainWindow === null) {
createWindow();
} else {
mainWindow.show();
}
});
由于加速器,可以使用Cmd + Q关闭应用程序:
const template = [{
label: 'Application',
submenu: [
...
{
label: 'Quit', accelerator: 'Command+Q', click: () => quitApp()
}
]
},
...
];
Menu.setApplicationMenu(Menu.buildFromTemplate(template));
这给了我想要的结果,虽然有副作用。该应用可以使用Cmd + Q关闭,但无法从扩展坞关闭(通过选择退出)或关闭系统(说它中断了关闭)。