深入浅出Electron:原理、工程与实践
上QQ阅读APP看书,第一时间看更新

4.1 使用方法

如果开发者使用electron-builder打包应用,那么也应考虑使用electron-updater来完成应用自动升级的开发工作,electron-updater这个库本身就是开发electron-builder的团队开发的(以前是一个独立的github仓储,现如今已经合并到electron-builder仓储内了),结合非常紧密,使用起来也很方便。

首先需要在electron-builder的配置信息中增加如下配置节:

publish: [{
  provider: "generic",
  url: "http:// download.yoursite.com"
}]

然后在应用程序的业务代码中增加如下逻辑:

const { autoUpdater } = require('electron-updater');
autoUpdater.checkForUpdates();
autoUpdater.on('update-downloaded', () => {
  this.mainWin.webContents.send('updateDownLoaded');
})
ipcMain.handle('quitAndInstall', (event) => {
  autoUpdater.quitAndInstall();
});

上述代码中autoUpdater.checkForUpdates方法会自动检测http://download.yoursite.com服务下是否存在比当前版本更新的版本文件,如果存在则会下载新版本相关的文件,下载完成会触发update-downloaded事件。在此事件中,应用可以向用户发出“重启应用以完成更新”的通知。

开发者可以在主进程通过webContents.send()方法向渲染进程发送'updateDownLoaded'消息,渲染进程通过ipcRenderer.on方法监听到此消息后,再操作Dom显示自定义的确认应用升级的对话框。如果开发者不需要实现自定义的确认对话框,也可以使用由Electron提供的dialog.showMessageBox方法,调用系统对话框,请求用户确认(此方法则直接在主进程调用,不需再与渲染进程交互了)。

用户在渲染进程确认升级后,渲染进程通过ipcRenderer.invoke方法发送quitAndInstall消息到主进程,主进程通过ipcMain.handle方法监听此消息,当主进程接收到此消息后调用autoUpdater.quitAndInstall()方法退出当前应用,并启动刚刚下载的新版本安装程序,开始安装新版本的应用。

这样当开发者发布了新版本后,只要把新版本相应的文件放置到http://download.yoursite.com服务上,在客户的旧版本应用程序启动时,就可以提示用户升级新版本了(应用启动时应主动执行上述逻辑)。

需要上传到升级服务器的文件,在各平台下略有不同,如下所示:

  • Windows平台需要把[your_project_name] Setup [your_project_version].exe和latest.yml两个文件上传到你的升级服务器。
  • Mac平台需要把[your_project_name]-[your_project_version]-mac.zip、[your_project_name]-[your_project_version].dmg和latest-mac.yml三个文件上传到你的升级服务器。
  • Linux平台需要把[your_project_name]-[your_project_version].AppImage和latest-linux.yml两个文件上传到你的升级服务器。

上述文件electron-builder生成安装包时都会为开发者生成好并存放到指定的目录下。