Electron-updater自升级方案总结

通过electron-updater方案进行 全量 自升级方案图如下:

image.png

一、配置

在package.json文件中配置publish字段,用来生成latest.yml文件,该文件是用来判断版本升级的,在打包过程中生成。

一旦修改了latest.yml文件,则需要重新打包生成,否则更新失败。

这里也可以不配置url字段,在main.js中手动配置,使用autoUpdater.setFeedURL

方法配置即可

"build": {
    "productName": "软件名称",
    "copyright": "copyright© xxx.,Ltd",
    "appId": "xxx",
    "asar": true,
    "directories": {
      "output": "build"
    },
    "publish": {
      "provider": "generic",
      "url": "服务端更新接口地址",
      "channel": "latest"
    }

二、方法

  1. 监听autoUpdater的事件,一有更新状态变化就会发事件
  • error 检查更新错误
  • checking-for-update 正在检查更新
  • update-available 有新的可用更新
  • update-not-available 没有可用的更新,也就是当前是最新版本
  • download-progress 正在下载更新版,会有更新进度对象
  • update-downloaded 新安装包下载完成
  1. 还有一些 api 可以控制流程
  • .checkForUpdates() 执行一次检查更新
  • .checkForUpdatesAndNotify() 执行一次检查更新,如果有新的可用更新,还会自定弹出一个自带的通知提示告诉用户有新的更新
  • .downloadUpdate(cancellationToken) 执行下载安装包
  • .quitAndInstall(isSilent, isForceRunAfter) 退出应用并安装更新, isSilent 是否静默更新,isForceRunAfter更新完后是否立即运行
  1. 还有一些配置项
  • autoDownload = true 有可用更新时是否自动下载
  • autoInstallOnAppQuit = true 如果安装包下载好了,那么当应用退出后是否自动安装更新
  • allowPrerelease = false 是否接受开发版,测试版之类的版本号
  • allowDowngrade = false 是否可以回退版本,比如从开发版降到旧的稳定版
/**
 * Auto Updater
 *
 * Uncomment the following code below and install `electron-updater` to
 * support auto updating. Code Signing with a valid certificate is required.
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating
 */

// 更新地址
const updateURL = "服务端更新接口地址"
// 检测更新
export function handleUpdate() {
  const message = {
    error: '检查更新出错',
    checking: '正在检查更新…',
    updateAva: '正在更新',
    updateNotAva: '已经是最新版本',
    downloadProgress: '正在下载...'
  }
  // 设置是否自动下载,默认是true,当点击检测到新版本时,会自动下载安装包,所以设置为false
  autoUpdater.autoDownload = false

  autoUpdater.setFeedURL(updateURL)
  autoUpdater.on('error', function (e) {
    log.warn('error', e);
    sendUpdateMessage({ cmd: 'error', message: message.error })
  })
  autoUpdater.on('checking-for-update', function () {
    log.warn(message.checking)
    sendUpdateMessage({ cmd: 'checking-for-update', message: message.checking })
  })
  autoUpdater.on('update-available', function (info) {
    log.warn(message.updateAva)
    sendUpdateMessage({ cmd: 'update-available', message: message.updateAva, info })
  })
  autoUpdater.on('update-not-available', function (info) {
    log.warn(message.updateNotAva)
    sendUpdateMessage({ cmd: 'update-not-available', message: message.updateNotAva, info: info })
  })
  // 更新下载进度事件
  autoUpdater.on('download-progress', function (progressObj) {
    log.warn('触发下载。。。')
    log.warn(progressObj)
    sendUpdateMessage({ cmd: 'downloadProgress', message: message.downloadProgress, progressObj })
  })
  autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
    // ipcMain.on('isUpdateNow', (e, arg) => {
    log.warn('开始更新')
    autoUpdater.quitAndInstall()
    mainWindow.destroy()
    // callback()
    // })
    // sendUpdateMessage({ cmd: 'isUpdateNow', message: null })
  })

  ipcMain.on('checkForUpdate', () => {
    log.warn('执行自动更新检查')
    autoUpdater.checkForUpdates()
  })

  ipcMain.on('downloadUpdate', () => {
    log.warn('执行下载')
    autoUpdater.downloadUpdate()
  })
}

// 通过main进程发送事件给renderer进程,提示更新信息
function sendUpdateMessage(data) {
  mainWindow.webContents.send('message', data)
}

三、update页面

  1. 发送请求检测消息,checkForUpdate
  2. 检测出错或没有新版本,进入主界面
  3. 如果有新版本,发送下载新版本请求:downloadUpdate

其中,在主进程download-progress事件的监测中返回的消息中可以取到如下信息

/**
 * progressObj
 * {
 *    bytesPerSecond // 网速
 *    delta
 *    percent // 已下载百分比
 *    total // 包大小
 *    transferred // 已下载大小
 * }
*/
  this.hasUpdate = true;
  this.progress = Math.trunc(progressObj.percent) || 0;
  this.total = fomatFloat(progressObj.total / 1000000, 1);
  this.transferred = fomatFloat(progressObj.transferred / 1000000, 1);

四、首页轮询检测更新

  1. 监测主进程中updater返回的消息
  2. 如果有新的版本,对比当前已跳过版本skipVersion(ex: 1.0.0===1.0.0),如果一致则不提示,否则弹出提示更新窗口
  3. 在更新弹出中,点击确定,则将路由跳转至update页面;点击取消,则记录当前版本,下次监测更新时,走第2步

优点:

  1. 配置简单,只需添加publish;
  2. 代码逻辑简单,只需添加autoUpdater逻辑

缺点:

  1. 安装包体积过大时,浪费带宽,增加用户升级时间,而且目前观察,升级过程网速很慢,基本2kb/s,网速慢的原因是我的服务器带宽(1Mb)很慢导致的~~
  2. 小功能没有必要进行全量升级
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容