侧边栏壁纸
博主头像
进一步,海阔天空 博主等级

进一步,海阔天空

  • 累计撰写 165 篇文章
  • 累计创建 19 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

electron实现自动更新功能

Kevin Meng
2023-12-02 / 0 评论 / 0 点赞 / 19 阅读 / 0 字

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:

0

评论区