单击电子自动更新

时间:2018-11-18 17:13:40

标签: electron auto-update

我正在尝试使我的电子应用程序可自动更新,在Google上搜索后,我发现了不错的指南。唯一的问题是我想为下载更新的时间创建一个按钮,以便用户可以决定何时更新和重新启动应用程序。到目前为止,我已经能够将这段代码放在一起

renderer.js

const electron = require('electron')
const ipcRenderer = electron.ipcRenderer

let lastMsgId = 0

window.quitAndInstall = function () {
  electron.remote.autoUpdater.quitAndInstall()
}

ipcRenderer.on('console', (event, consoleMsg) => {
  console.log(consoleMsg)
})

ipcRenderer.on('message', (event, data) => {
  showMessage(data.msg, data.hide, data.replaceAll)
})

function showMessage(message, hide = true, replaceAll = false) {
  const messagesContainer = document.querySelector('.messages-container')
  const msgId = lastMsgId++ + 1
  const msgTemplate = `<div id="${msgId}" class="alert alert-info alert-info-message animated fadeIn">${message}</div>`

  if (replaceAll) {
    messagesContainer.innerHTML = msgTemplate
  } else {
    messagesContainer.insertAdjacentHTML('afterbegin', msgTemplate)
  }

  if (hide) {
    setTimeout(() => {
      const msgEl = document.getElementById(msgId)
      msgEl.classList.remove('fadeIn')
      msgEl.classList.add('fadeOut')
    }, 4000)
  }
}

这是我存储邮件的index.js

const electron = require('electron');
const {autoUpdater} = require('electron-updater');
const log = require('electron-log');
const appVersion = require('./package.json').version

// configure logging
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';
log.info('App starting...');

const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1020,
    height: 800,
  });
  mainWindow.loadURL('file://' +__dirname + '/public/index.html');

  // Open the DevTools.
  //mainWindow.webContents.openDevTools();

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

app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', function() {
    app.quit();
});

app.on('activate', function() {
  // 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();
  }
});

//-------------------------------------------------------------------
// Auto updates
//-------------------------------------------------------------------
const sendStatusToWindow = (text) => {
  log.info(text);
  if (mainWindow) {
    mainWindow.webContents.send('console', `App version: ${appVersion}`)
    mainWindow.webContents.send('message', { msg: `App version: ${appVersion}` })
  }
};

autoUpdater.on('error', (ev, err) => {
  mainWindow.webContents.send('message', { msg: `Error: ${err}` })
})

autoUpdater.once('checking-for-update', (ev, err) => {
  mainWindow.webContents.send('message', { msg: 'Checking for updates' })
})

autoUpdater.once('update-available', (ev, err) => {
  mainWindow.webContents.send('message', { msg: 'Update available. Downloading ⌛️', hide: false })
})

autoUpdater.once('update-not-available', (ev, err) => {
  mainWindow.webContents.send('message', { msg: 'Update not available' })
})

autoUpdater.once('update-downloaded', (ev, err) => {
  const msg = 'Update downloaded - <button onclick="quitAndInstall()">Restart</button>'
  mainWindow.webContents.send('message', { msg, hide: false, replaceAll: true })
})

autoUpdater.checkForUpdates()

如您所见,我添加了一个按钮来调用函数,但是它不起作用。当我按下按钮时,什么也没发生。如果我删除按钮,只是说auto.updater.quitAndInstall(),它就可以工作。它会自动关闭窗口并安装新版本。我想念什么?

1 个答案:

答案 0 :(得分:0)

我认为是electron.remote.autoUpdater.quitAndInstall()在渲染器中运行时不起作用。

在文档中,它并没有说什么反对在渲染器进程中运行它,但是我认为向主进程发送一条消息以运行quitAndInstall函数是可行的。

quitAndInstall函数内部放这个:

ipcRenderer.send('asynchronous-message', 'quitAndInstall');

然后在主流程中放入:

electron.ipcMain.on('asynchronous-message', function (evt, message) {
    if (message == 'quitAndInstall') {
        autoUpdater.quitAndInstall();
    }
});