阿里云oss搭建electron应用更新服务

发布时间:

更新时间:

其实就是想给 electron 应用加个自动更新功能,但网上搜索的到的涉及私有部署的方法都比较麻烦,于是做研究下,这个比较适合在内部或者一定群体内使用,若是普通用户最好加上 ui 和自主检查更新。
其实阿里云 oss 并不存在搭建问题,只要有公开读的一个目录即可,因为不知道该写个什么名字(doge)

以下只对 win 系统实践过。

需求/方案

  • electron 应用自动更新
  • 私有部署,未托管在 github 等公开仓库
  • 没有公开服务,只有阿里云 oss 可用
  • 打包工具是 electron-forge

更新流程

  • 开发者
    • 打包发布后,将两个文件上传到 oss 上即可(将文件拖拽到 ossbrowser 上)
  • 用户
    • 每次打开应用后会在后台检查更新,若有更新则自动下载,若 app 在使用中弹出是否要马上更新的确认框,若马上更新则关闭后重新打开,若稍后更新,在程序关闭后更新,下次打开就是新的版本

前置条件

  • 已安装 electron-forge
  • 有公开读的阿里云 oss,猜测公开的云存储可能都行。
  • 只有发布版本才支持更新(非 package 打包的绿色版本)
  • mac 上好像得签名才行,后续有时间再确认下

改造过程

只修改 main.js 即可

  1. electron-forge 相关调整,若已经处理过的就跳过,一度怀疑为啥官方推荐这个,个人认为 electron-builder 比这个好用。

    1. 加上桌面和菜单快捷方式

    2. 修复安装时两次弹出窗口问题

  2. 使用官方自带的更新功能 auto-updater

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const { app, autoUpdater, dialog } = require('electron');

// 可以在打开应用时就检查,比如:
app.whenReady().then(() => {
createWindow();
checkForUpdates();
}

// 如果要用户点击时再检查,就渲染层往这里发消息再检查

function CheckUpdate(){
// 开发调试时跳过,即使不跳过在后面也会报错
if (!app.isPackaged) {
return;
}

// 注意是oss的文件夹地址,文件夹权限是公开读
const url = "https://bucketname.xxx.aliyuncs.com/dirname/";

//这里可能会出错,生产环境建议写日志
try {
autoUpdater.setFeedURL(feed);
} catch (error) {
console.error(error);
}

// 绑定事件,更新结束后弹窗
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: "info",
buttons: ["重启应用", "稍后"],
title: "软件更新",
// message: process.platform === 'win32' ? releaseNotes : releaseName,
detail: `新版本(${name})已下载,是否现在重启?`,
};

dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
});
})

// 执行检查更新
try {
autoUpdater.checkForUpdates();
} catch (error) {
console.log(error);
}
}

调整思路

electron-forge 官方的理念是无感安装更新,但更新不可控多少有点别扭,尤其对普通用户来说,所以改进思路大概是:

  1. 用户在页面上点击检查更新(这时需要渲染进程向主进程发送消息)
  2. 若有更新,用户确认马上更新后,显示下载进度条,下载完毕后自动关闭并安装再重启(这时需要绑定相关事件,将事件信息比如错误信息,是否有新版本,下载进度等传回渲染进程并显示在页面上。)
请吃小笼包
支付宝 | Alipay
微信 | Wechat