一段时间以来,我一直在尝试用我们的电子应用程序调试问题,但是这已经成为一个难题。
问题:间歇性地,当使用退出快捷方式( cmd + Q )时,应用程序用户界面成功消失,但停留在菜单栏(mac)/通知try(win)中并显示悬停时死亡的沙滩球。
我必须进入活动监视器以实际强制关闭它 app not responding
这仅在打包的生产应用中发生,而不在开发模式下发生。在查看日志时,似乎所有退出事件都被正确击中了。
app.on('window-all-closed', () => {
log.info('All windows closed');
if (process.platform != 'darwin') {
app.quit();
}
});
// Logs to help nail down quit failures
app.on('will-quit', () => log.info('App will quit'));
app.on('quit', () => log.info('App is quitting'));
app.on('before-quit', async () => {
log.info('Attempting to quit app');
}
log.log的尾巴
[2019-02-04 14:29:34.543] [info] electron: message received: windows-info
[2019-02-04 14:29:35.831] [info] Attempting to quit app
[2019-02-04 14:29:35.919] [info] stopping mouse tracking
[2019-02-04 14:29:36.073] [info] App will quit
[2019-02-04 14:29:36.079] [info] App is quitting
[2019-02-04 14:29:36.127] [info] mac binary: main.swift:49 : sendPayload(messageToSend:): {"type":"will-close-expectedly"}
[2019-02-04 14:29:36.128] [info] electron: message received: will-close-expectedly
[2019-02-04 14:29:36.130] [info] daemon binary /Applications/Loom.app/Contents/Resources/app.asar.unpacked/dist/binaries/loom-mac-recorderproduction exited
[2019-02-04 14:29:37.555] [error] No menubar present
[2019-02-04 14:29:37.676] [error] No menubar present
[2019-02-04 14:29:39.537] [error] No menubar present
[2019-02-04 14:29:39.675] [error] No menubar present
[2019-02-04 14:29:41.653] [error] No menubar present
[2019-02-04 14:29:41.790] [error] No menubar present
从日志中可以看到,所有退出事件均以正确的顺序触发,但该应用程序仍停留在mac菜单栏中。发生的一件有趣的事是[error] No menubar present
。每当我尝试单击菜单栏中的图标时,都会显示该信息。尝试隐藏应用菜单时,它应该应该抛出。
这是相关的菜单栏:https://github.com/maxogden/menubar。
这是成功退出日志的样子
019-02-04 14:52:36.722] [info] Attempting to quit app
[2019-02-04 14:52:36.740] [info] stopping mouse tracking
[2019-02-04 14:52:36.868] [info] App will quit
[2019-02-04 14:52:36.874] [info] App is quitting
[2019-02-04 14:52:36.887] [info] mac binary: main.swift:49 : sendPayload(messageToSend:): {"type":"will-close-expectedly"}
[2019-02-04 14:52:36.889] [info] daemon binary /Applications/LoomStaging.app/Contents/Resources/app.asar.unpacked/dist/binaries/loom-mac-recorderstaging exited
是否有任何方法可以使应用程序挂起,因为在主进程中似乎没有抛出任何错误,只是所有UI元素都消失了但进程仍然存在的幽灵状态。有没有一种方法可以更深入地了解正在发生的事情/它挂在哪里。
另一个有趣的问题是,每当我们执行updateAnd quitAndInstall(使用电子生成器)时,如果上述菜单栏为hidden
,那么几乎总是我们会达到这种奇怪的挂起状态,但是当菜单栏为可见,然后我们启动quitAndInstall,就可以正常工作。
答案 0 :(得分:0)
我已经用准系统示例创建了测试repo。
在我的机器上,它工作正常(我在process.platform
事件中删除了对window-all-closed
的检查,但是我测试了有无这些检查-两种方法都可以工作):
const { menubar } = require('menubar');
const { app, Menu, Tray, autoUpdater, dialog } = require('electron');
autoUpdater.setFeedURL(`https://update.electronjs.org/sanperrier/menubar-test/${process.platform}-${process.arch}/${app.getVersion()}`);
autoUpdater.on('update-not-available', () => {
dialog.showMessageBox({
title: "No available updates",
message: `No available updates\ncurrent version: ${app.getVersion()}`
});
});
autoUpdater.on('update-available', () => {
dialog.showMessageBox({
title: "Update is downloading",
message: `Update is downloading\ncurrent version: ${app.getVersion()}`
});
});
autoUpdater.on('update-downloaded', async (e, notes, name) => {
await dialog.showMessageBox({
title: "Update downloaded",
message: `Update downloaded\ncurrent version: ${app.getVersion()}\nnew version: ${name}`,
detail: notes
});
autoUpdater.quitAndInstall();
});
app.on('ready', () => {
const tray = new Tray(require.resolve('menubar/assets/IconTemplate.png'));
const contextMenu = Menu.buildFromTemplate([
{
label: `Check for updates and install (current: ${app.getVersion()})`,
type: 'normal',
click: () => autoUpdater.checkForUpdates()
},
{
label: 'Close window',
type: 'normal',
click: () => mb.window?.close()
},
{
label: 'Exit',
type: 'normal',
click: () => app.quit()
}
]);
tray.setContextMenu(contextMenu);
const mb = menubar({ tray });
});
app.on('window-all-closed', e => {
console.log('window-all-closed');
// if (process.platform != 'darwin') {
app.quit();
// }
});
app.on('before-quit', () => console.log('before-quit'));
app.on('will-quit', () => console.log('will-quit'));
app.on('quit', async () => console.log('quit'));
工作正常。
可能的问题:
app.quit()
平台的window-all-closed
中调用darwin
会有所帮助menubar
源中搜索了“不存在菜单栏”,但没有发现任何错误,因此此错误源自您的代码或第三方代码。还是menubar
的旧版本?请澄清一下,“菜单是hidden
”是什么意思。
作为一种解决方法,您可以尝试将app.exit(0)
添加到quit
事件处理程序中。我不确定它会不会破坏autoUpdate.quitAndInstall()
。我使用以下代码进行了测试:app.on('quit', () => { console.log('quit'); app.exit(0); })
,它运行良好:
$ menubar-test.app/Contents/MacOS/menubar-test
2020-08-08 13:35:20.689 menubar-test[62834:6522941] Download completed to: file:///Users/sanperrier/Library/Caches/com.electron.menubar-test.ShipIt/update.aaHFVTv/menubar-test-darwin-x64-1.1.11.zip
before-quit
will-quit
quit
应用下载了更新并重新启动(安装了更新)。
希望这会有所帮助。随意分叉我的存储库,并用它确定问题的根本原因。