electron 一般有两种方式更新:
- 主进程修改: 全亮更新
- 渲染进程修改: 全亮/增量更新
electron-updater
一般我们都用 electron-updater
包来进行我们 electron
应用的自动更新, electron-updater
更新只需要把一个 url
传入, 然后它会自动查找${url}/xxx.yml
文件, 根据这个yml文件检测更新及下载, 这个url下是放静态资源的,简单来说就是这个链接类似访问一个目录,这个目录下需要有更新的文件以及检测更新的文件, 一般更新流程如下:
- 接口请求返回更新信息, 拿到更新逻辑之后对比触发更新
electron-updater
包自动更新下载至本地缓存, 抛出下载状态- 替换缓存包与本地包, 重启应用完成更新
更新文件在 electron-builder
打包时候会生成我们需要的 .yml
文件
- win: latest.yml, exe
- mac:latest-mac.yml, zip
zipSquirrel.Mac 需要 macOS 的 target , 否则 latest-mac.yml 无法创建, 导致 autoUpdater 报错. macOS 的默认目标是 dmg + zip , 因此无需明确指定目标
支持 Mac M1 芯片
由于最新的 Electron 已经支持了 M1 芯片, arm 架构下的 Mac, 支持条件:
Electron
11.0.0 版本以上electron-builder
22.9.1 以上
支持 Intel 和 Apple M1 的通用应用需要在配置中吧
arch
值设置为universal
就行了
下载缓存
在开发时我们可能会做开发调试, 比如看下载进度呀什么的, 先打了一个高版本的放在远程地址, 本地重复安装低版本的看更新效果, 但是在第一次更新完成后, 后面的更新都是瞬间完成了, 看不到进度, 这里是由于 electron-updater
在更新时会检测本地是否下载过这个高版本, 有的话直接用本地的进行安装, 我们可以把这个缓存文件删除掉
electronName 这个是你设置的name
win:C:\Users\Administrator(你的用户)\AppData\Local\electronName-updater
mac:~/Library/Application Support/Caches/electronName-updater
更新错误检测
比较常见的几个可能会引发的问题:
- mac端下载进度不动: mac端打包会出现三个文件, dmg安装包, dmg 的 zip 压缩包以及 yml 件, 比 win 多一个 zip 压缩包, mac 更新下载的是 zip 文件, 很多同学以为和 win 的 exe 一样放 (win是exe和yml) , 把dmg文件放到更新地址下,没有zip文件,这会导致检测到更新, 但下载进度却不动.
- 更新下载后没有重启, 打开软件版本也没有变: 可能在关闭渲染进程中使用了
e.preventDefault()
, 我们在调用重启更新时设置一下willQuitApp
让其正常关闭
global.willQuitApp = true
autoUpdater.quitAndInstall()