即使已成功触发所有退出事件,Electron应用程序仍会退出

时间:2019-02-04 23:00:25

标签: electron hang electron-builder

一段时间以来,我一直在尝试用我们的电子应用程序调试问题,但是这已经成为一个难题。

问题:间歇性地,当使用退出快捷方式( 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,就可以正常工作。

1 个答案:

答案 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'));

工作正常。

可能的问题:

  1. 电子的旧版本
  2. 也许在app.quit()平台的window-all-closed中调用darwin会有所帮助
  3. 我在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

应用下载了更新并重新启动(安装了更新)。

希望这会有所帮助。随意分叉我的存储库,并用它确定问题的根本原因。