App端代码
首先,新建一个在src/update/index.js文件,内容如下:
import { autoUpdater, dialog } from "electron";
//import mainWindow from "../../background";
// 定义更新链接地址
const updateUrl = 'http://127.0.0.1:8122'
// 设置日志输出
//autoUpdater.logger = Log4js;
// 初始化更新
export const initUpadate = () => {
autoUpdater.forceDevUpdateConfig = true // 强制使用开发环境进行更新
autoUpdater.autoDownload = true // 设置自动下载更新
autoUpdater.setFeedURL(updateUrl) // 设置更新地址
autoUpdater.checkForUpdates(); // 检查更新
// 注册更新过程中的各种事件
autoUpdater.on("error", function (error) {
printUpdaterMessage('error')
console.error("检查更新失败:" + error)
});
autoUpdater.on("checking-for-update", function () {
printUpdaterMessage('checking-for-update')
});
autoUpdater.on("update-available", function (info) {
printUpdaterMessage('update-available')
});
autoUpdater.on("update-not-available", function (info) {
printUpdaterMessage('update-not-available')
});
autoUpdater.on("download-progress", function (info) {
printUpdaterMessage('download-progress')
});
autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
//printUpdaterMessage('update-downloaded')
// setTimeout(() => {
// mainWindow.webContents.send("app-update-downloaded", true);
// }, 3000)
console.log("新版本下载完成");
const dialogOpts = {
type: 'info',
buttons: ['立刻安装', '稍后安装'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'检测到新版本,是否安装并重启应用?'
}
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
});
}
// 打印更新过程中的消息
function printUpdaterMessage(key) {
let message = {
'error': "更新出错",
'checking-for-update': "正在检查更新",
'update-available': "检测到新版本",
'download-progress': "下载中",
'update-not-available': "无新版本",
'update-downloaded': "新版本下载完成"
};
}
// 安装更新
export const intsallUpdateApp = () => {
console.info('update', 'intsallUpdateApp')
autoUpdater.quitAndInstall() // 退出并安装更新
}
然后在background.js文件中添加升级检测代码,大概如下:
import {initUpadate} from '@/update/index'
app.on('ready', async () => {
//创建菜单
createMenu()
if (isDevelopment && !process.env.IS_TEST) {
// Install Vue Devtools
try {
await installExtension(VUEJS3_DEVTOOLS)
} catch (e) {
console.error('Vue Devtools failed to install:', e.toString())
}
}
createWindow()
//初始化自动更新
initUpadate()
})
这样electron应用的App端检查更新代码就写好了,接着我们用springboot实现一个简单的服务器端接口。
服务器端
服务器端我们可以自己写一个简单的Rest服务来提供应用更新接口,也可以使用开源的代码,electron官方给我们推荐的了几个,包括:
Hazel——用于私人或开源应用的更新服务器,可在 Vercel 上免费部署。 它从GitHub Releases中拉取更新文件,并且利用 GitHub CDN 的强大性能。
Nuts-同样使用GitHub Releases, 但得在磁盘上缓存应用程序更新并支持私有存储库.
electron-release-server – 提供一个用于处理发布的仪表板,并且不需要在GitHub上发布发布。
Nucleus – 一个由Atlassian维护的 Electron 应用程序的完整更新服务器。 支持多种应用程序和渠道; 使用静态文件存储来降低服务器成本.
比较了一下,个人觉得electron-release-server还蛮好的,下面就以electron-release-server为例来介绍如何部署一个electron应用更新服务接口。
部署electron-release-server 的docker-compose.yaml文件如下(感谢rainboy2010提供的image)。
version: '2'
services:
electron-release-server-web:
image: rainboy2010/electron-release-server:latest
environment:
WEBSITE_TITLE: 'fitit100自动更新服务'
WEBSITE_HOME_CONTENT: 'fitit100自动更新服务'
WEBSITE_NAV_LOGO: ''
WEBSITE_APP_TITLE: 'fitit100自动更新服务'
APP_USERNAME: fitit100
APP_PASSWORD: admin_password
DB_HOST: electron-release-server-db
DB_PORT: 5432
DB_USERNAME: releaseserver
DB_NAME: releaseserver
DB_PASSWORD: db_password
# DEKs should be 32 bytes long, and cryptographically random.
# You can generate such a key by running the following:
# require('crypto').randomBytes(32).toString('base64')
# PLEASE ENSURE THAT YOU CHANGE THIS VALUE IN PRODUCTION
DATA_ENCRYPTION_KEY: oIh0YgyxQbShuMjw4/laYcZnGKzvC3UniWFsqL0t4Zs=
# Recommended: 63 random alpha-numeric characters
# Generate using: https://www.grc.com/passwords.htm
TOKEN_SECRET: your_token_here
APP_URL: 'localhost:8122'
ASSETS_PATH: '/usr/src/electron-release-server/releases'
depends_on:
- electron-release-server-db
ports:
- '8122:80'
entrypoint: ./scripts/wait.sh electron-release-server-db:5432 -- npm start
volumes:
- ./releases:/usr/src/electron-release-server/releases
electron-release-server-db:
image: postgres:11
environment:
POSTGRES_PASSWORD: db_password
POSTGRES_USER: releaseserver
volumes:
- postgres:/var/lib/postgresql/data
volumes:
postgres:
评论区