"electron-builder": "^18.2.1"
"electron-updater": "^1.16.0"
Target: Mac
My auto-update on Windows is working fine. However I still have two issues on the Mac.
On the Mac it recognises that there is an update then asks the user if they want to download and install. If the user responds 'Yes' then the update is downloaded and the user is advised that the new version is downloaded and will be installed when they click OK. However the quitAndInstall never seems to get called. If I close the app and re-open it again it just goes through the same process. Also on Mac my progress is not logged to my log file, nor is the status bar working. Both of these things work correctly on Windows. See code and log file below.
`autoUpdater.on('download-progress', (progressObj) => {
let log_message = "Download speed: " + progressObj.bytesPerSecond;
log_message = log_message + ' - Downloaded ' + progressObj.percent + '%';
log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')';
log.log('info', log_message);
mainWindow.setProgressBar((progressObj && progressObj.percent) ? progressObj.percent / 100 : -1)
});
autoUpdater.on('update-downloaded', (versionInfo) => {
var dialogOptions = {
type: 'question',
defaultId: 0,
message: `The update is ready to install, Version ${versionInfo.version} has been downloaded and will be automatically installed when you click OK`
};
dialog.showMessageBox(mainWindow, dialogOptions, function() {
if (!isDev) {
autoUpdater.quitAndInstall();
}
});
});`
I've made another donation. Any chance of getting some help with this issue?
Also on Mac my progress is not logged to my log file
Fixed in the electron-updater 2.0.0
It is not electron-updater issue. Please see https://github.com/electron/electron/issues/3583
As you have made a donation, issue was investigated by me for you.
You need to modify your code:
setImmediate(() => {
app.removeAllListeners("window-all-closed")
if (focusedWindow != null) {
focusedWindow.close()
}
autoUpdater.quitAndInstall(false)
})
quitAndInstall
or other actions only in the setImmediate
. To ensure that all dialog/sheet windows were released.window-all-closed
handler (if it is added, e.g. https://github.com/develar/onshape-desktop-shell/blob/master/src/WindowManager.ts#L16) doesn't prevent quit, remove all such listeners app.removeAllListeners("window-all-closed")
.mainWindow.close()
If you have more than one windows, close all (BrowserWindow.getAllWindows()
to get all windows).If still no luck — try mainWindow.destroy()
.
Don't forget to update to electron-updater 2.1.1
Thanks @develar. Both issues are now resolved. Mac auto-updates are working nicely. Appreciate your help.
Did not work for windows.
The app does not start after closing.
@develar I am having same issue autoUpdater
is working fine on windows but having issues on mac.
Electron Version: 1.7.5
app.on('ready', () => {
// handle app updates
if (process.env.NODE_ENV !== 'development') {
autoUpdater.setFeedURL(updateFeedUrl);
autoUpdater.on('error', (err) => {
console.log(err);
});
// wait for things to settle in
setTimeout(() => {
checkForUpdates();
}, 30000);
}
ipcMain.on('application:quit-install', () => autoUpdater.quitAndInstall());
autoUpdater.on('update-downloaded', () => {
updateDownloaded = true;
dialog.showMessageBox({
title: 'New Version Downloaded',
message: 'The update will be applied the next time you start the app. Close and restart now to run the latest version.',
buttons: ['Restart', 'Later'],
icon: dialogIcon
}, (response) => {
if (response === 0) {
autoUpdater.quitAndInstall();
}
});
});
autoUpdater.on('update-available', () => { updateAvailable = true;
console.log('update-av', updateAvailable);
});
let opts = {
show: false,
width: 1200,
height: 720,
minWidth: 1200,
minHeight: 720,
titleBarStyle: 'hiddenInset'
};
Object.assign(opts, config.getData().winBounds);
delete opts.fullscreen; // prevent app from launching fullscreen
mainWindow = new BrowserWindow(opts);
mainWindow.loadURL(`file://${__dirname}/app/app.html`);
template = getTemplate();
menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
});
@sweetevil unfortunately, the author left out a critical piece of information from the documentation -- auto updating will not work unless your Mac application is signed.
I found this out by reading through the electron docs for auto updating.
Your application must be signed for automatic updates on macOS. This is a requirement of Squirrel.Mac
As electron-builder makes use of Squirrel.Mac, this may be the cause of your issue.
@purplekrayons My issue was with me using dmg format but zip format was needed to make it work. I just changed the format and it worked for our customers fine 👍
@sweetevil Most interesting. Are you signing your Mac app? I wasn't able to get mine working -- to note I am using .zip -- this makes me think perhaps I have another thats causing my mac clients not to auto-update.
I (quite naturally) had a close
event on a BrowserWindow set up (for Macs) in order to capture the Command+W
hotkey. Because of this, the autoUpdater.quitAndInstall
method wasn't working. Here's my go at a helper-function to deal with cases of aggressive event listeners preventing the app from properly restarting:
/**
* ensureSafeQuitAndInstall
*
* @access public
* @return void
*/
function ensureSafeQuitAndInstall() {
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
app.removeAllListeners('window-all-closed');
var browserWindows = BrowserWindow.getAllWindows();
browserWindows.forEach(function(browserWindow) {
browserWindow.removeAllListeners('close');
});
}
Hope this is helpful to someone out there :)
I (quite naturally) had a
close
event on a BrowserWindow set up (for Macs) in order to capture theCommand+W
hotkey. Because of this, theautoUpdater.quitAndInstall
method wasn't working. Here's my go at a helper-function to deal with cases of aggressive event listeners preventing the app from properly restarting:/** * ensureSafeQuitAndInstall * * @access public * @return void */ function ensureSafeQuitAndInstall() { const electron = require('electron'); const app = electron.app; const BrowserWindow = electron.BrowserWindow; app.removeAllListeners('window-all-closed'); var browserWindows = BrowserWindow.getAllWindows(); browserWindows.forEach(function(browserWindow) { browserWindow.removeAllListeners('close'); }); }
Hope this is helpful to someone out there :)
This (we think) just solved a massive issue with our app's upgrade flow. Thanks!
ps. my loom hasn't worked for ages ;)
Most helpful comment
It is not electron-updater issue. Please see https://github.com/electron/electron/issues/3583
As you have made a donation, issue was investigated by me for you.
You need to modify your code:
quitAndInstall
or other actions only in thesetImmediate
. To ensure that all dialog/sheet windows were released.window-all-closed
handler (if it is added, e.g. https://github.com/develar/onshape-desktop-shell/blob/master/src/WindowManager.ts#L16) doesn't prevent quit, remove all such listenersapp.removeAllListeners("window-all-closed")
.mainWindow.close()
If you have more than one windows, close all (BrowserWindow.getAllWindows()
to get all windows).If still no luck — try
mainWindow.destroy()
.Don't forget to update to electron-updater 2.1.1