打包后电子托盘图标不显示

时间:2018-09-17 20:22:36

标签: electron electron-builder electron-packager

我有一个Electron应用程序,其中显示一个托盘图标,单击该图标会显示我的主窗口。在开发模式下效果很好,但是当我将其打包(放入.app文件中)并双击.app文件时,没有菜单显示,更重要的是,该图标没有显示,因此用户永远看不到我的应用。

我正在使用电子React / Redux样板(https://github.com/chentsulin/electron-react-boilerplate

这是我的main.dev.js文件-感谢您的猜测:

import { app, BrowserWindow, Tray } from 'electron';
import MenuBuilder from './menu';

let mainWindow = null;
let tray;

if (process.env.NODE_ENV === 'production') {
  const sourceMapSupport = require('source-map-support');
  sourceMapSupport.install();
}

if (
  process.env.NODE_ENV === 'development' ||
  process.env.DEBUG_PROD === 'true'
) {
  require('electron-debug')();
  const path = require('path');
  const p = path.join(__dirname, '..', 'app', 'node_modules');
  require('module').globalPaths.push(p);
}

const installExtensions = async () => {
  const installer = require('electron-devtools-installer');
  const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
  const extensions = ['REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS'];

  return Promise.all(
    extensions.map(name => installer.default(installer[name], forceDownload))
  ).catch(console.error);
};

/**
 * Add event listeners...
 */

app.on('window-all-closed', () => {
  // Respect the OSX convention of having the application in memory even
  // after all windows have been closed
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

const getWindowPosition = () => {
  const windowBounds = mainWindow.getBounds();
  const trayBounds = tray.getBounds();

  // Center window horizontally below the tray icon
  const x = Math.round(
    trayBounds.x + trayBounds.width / 2 - windowBounds.width / 2
  );

  // Position window 4 pixels vertically below the tray icon
  const y = Math.round(trayBounds.y + trayBounds.height + 4);

  return { x, y };
};

function createTray() {
  const path = require('path');
  const iconPath = path.join(__dirname, 'confluence.png');
  tray = new Tray(iconPath);
  tray.setToolTip('Confluence Helper');
  tray.on('click', event => {
    toggleWindow();

    // Show devtools when command clicked
    if (mainWindow.isVisible() && process.defaultApp && event.metaKey) {
      mainWindow.openDevTools({ mode: 'detach' });
    }
  });
}
const toggleWindow = () => {
  if (mainWindow.isVisible()) {
    mainWindow.hide();
  } else {
    showWindow();
  }
};

const showWindow = () => {
  const position = getWindowPosition();
  mainWindow.setPosition(position.x, position.y, false);
  mainWindow.show();
  mainWindow.focus();
};

app.on('ready', async () => {
  if (
    process.env.NODE_ENV === 'development' ||
    process.env.DEBUG_PROD === 'true'
  ) {
    await installExtensions();
  }

  mainWindow = new BrowserWindow({
    show: false,
    width: 500,
    height: 728,
    icon: `${__dirname}/confluence.icns`
  });

  mainWindow.loadURL(`file://${__dirname}/app.html`);

  createTray();
  // @TODO: Use 'ready-to-show' event
  //        https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event
  mainWindow.webContents.on('did-finish-load', () => {
    if (!mainWindow) {
      throw new Error('"mainWindow" is not defined');
    }
    if (process.env.START_MINIMIZED) {
      mainWindow.minimize();
    }
  });
  mainWindow.on('blur', () => {
    mainWindow.hide();
  });

  mainWindow.on('closed', () => {
    mainWindow = null;
  });

  const menuBuilder = new MenuBuilder(mainWindow);
  menuBuilder.buildMenu();
});

1 个答案:

答案 0 :(得分:1)

当我右键单击.app文件并选择“显示包内容” 时,我可以看到一个Contents / Mac文件夹,里面是一个Unix可执行文件,当我在其中运行时命令行向我显示了与我的任务栏图标有关的被拒绝的承诺-我在做path.join(__dirname,'icon.png'),最终变成了错误的路径(console.log(path.join(__dirname,'icon.png'))进行救援!

当我将其更改为绝对路径('users / myname / app / icon.png')并重建后,它起作用了!

但是,这显然不能在其他人的计算机上使用-在我的计算机(tm)上确实可以使用,但这还不够好。

要真正修复它,我可能已经过分了-但这对我有用-通过在其中使用path.join(__ dirname,'resources','icon.png')创建一个NativeImage我传递给我的东西。我还在package.json的 build / files 下添加了资源。

如果您遇到此类问题,我建议您做我所做的事情(显示包装内容等),以查看打包的电子应用程序中的问题。