From 6ea706127d0e888941555c9ed8af30c7fc35ce2d Mon Sep 17 00:00:00 2001 From: layyback <505187749@qq.com> Date: Sat, 24 Jun 2023 22:49:22 +0800 Subject: [PATCH] :sparkles: add windows auto-update feature --- package.json | 5 +- src/main/browsers/main.ts | 30 +++++---- src/main/common/registerHotKey.ts | 2 +- src/main/common/versionHandler.ts | 105 ++++++++++++++++++++++++++++++ vue.config.js | 7 ++ 5 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 src/main/common/versionHandler.ts diff --git a/package.json b/package.json index 18a6e29..08f8e63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rubick", - "version": "2.2.8", + "version": "1.1.1", "author": "muwoo <2424880409@qq.com>", "private": true, "scripts": { @@ -62,6 +62,5 @@ "typescript": "~4.1.5", "vue-cli-plugin-electron-builder": "~2.1.1", "worker-plugin": "^5.0.1" - }, - "__npminstall_done": false + } } diff --git a/src/main/browsers/main.ts b/src/main/browsers/main.ts index e2e2d87..7f392b4 100644 --- a/src/main/browsers/main.ts +++ b/src/main/browsers/main.ts @@ -1,6 +1,7 @@ -import { app, BrowserWindow, protocol } from "electron"; -import path from "path"; -import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; +import { app, BrowserWindow, protocol } from 'electron'; +import path from 'path'; +import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'; +import versonHandler from '../common/versionHandler'; export default () => { let win: any; @@ -15,7 +16,7 @@ export default () => { resizable: true, width: 800, frame: false, - title: "拉比克", + title: '拉比克', show: false, skipTaskbar: true, webPreferences: { @@ -25,40 +26,41 @@ export default () => { contextIsolation: false, webviewTag: true, nodeIntegration: true, - preload: path.join(__static, "preload.js") - } + preload: path.join(__static, 'preload.js'), + }, }); if (process.env.WEBPACK_DEV_SERVER_URL) { // Load the url of the dev server if in development mode win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string); } else { - createProtocol("app"); + createProtocol('app'); // Load the index.html when not in development - win.loadURL("app://./index.html"); + win.loadURL('app://./index.html'); } - protocol.interceptFileProtocol("image", (req, callback) => { + protocol.interceptFileProtocol('image', (req, callback) => { const url = req.url.substr(8); callback(decodeURI(url)); }); - win.on("closed", () => { + win.on('closed', () => { win = undefined; }); - win.on("show", () => { + win.on('show', () => { win.webContents.executeJavaScript( `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onShow === "function" && window.rubick.hooks.onShow()` ); + versonHandler.checkUpdate(); // win.webContents.openDevTools(); }); - win.on("hide", () => { + win.on('hide', () => { win.webContents.executeJavaScript( `window.rubick && window.rubick.hooks && typeof window.rubick.hooks.onHide === "function" && window.rubick.hooks.onHide()` ); }); // 判断失焦是否隐藏 - win.on("blur", () => { + win.on('blur', () => { const config = { ...global.OP_CONFIG.get() }; if (config.perf.common.hideOnBlur) { win.hide(); @@ -70,6 +72,6 @@ export default () => { return { init, - getWindow + getWindow, }; }; diff --git a/src/main/common/registerHotKey.ts b/src/main/common/registerHotKey.ts index a3d6160..bfa0b38 100644 --- a/src/main/common/registerHotKey.ts +++ b/src/main/common/registerHotKey.ts @@ -69,7 +69,7 @@ const registerHotKey = (mainWindow: BrowserWindow): void => { ) ); - mainWindow.setAlwaysOnTop(true); + mainWindow.setAlwaysOnTop(false); mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true }); mainWindow.focus(); mainWindow.setVisibleOnAllWorkspaces(false, { diff --git a/src/main/common/versionHandler.ts b/src/main/common/versionHandler.ts new file mode 100644 index 0000000..3270884 --- /dev/null +++ b/src/main/common/versionHandler.ts @@ -0,0 +1,105 @@ +import { dialog } from 'electron'; +import { autoUpdater } from 'electron-updater'; +import pkg from '../../../package.json'; +import API from './api'; +import commonConst from '@/common/utils/commonConst'; +import { main } from '../browsers'; +import { app } from 'electron'; + +Object.defineProperty(app, 'isPackaged', { + get() { + return true; + }, +}); + +class VersionHandler { + private lastestVersion: string; + private currentVersion: string; + private releaseNotes: string; + private isUpdate: boolean; + + constructor() { + this.lastestVersion = ''; + this.currentVersion = pkg.version; + this.releaseNotes = ''; + this.isUpdate = false; + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = false; + } + + checkForMacAndWindows() { + let sendUpdateMsg = false; + autoUpdater.removeAllListeners(); + // update-available 会触发多次,限制只通知一次 + autoUpdater.checkForUpdates(); + + autoUpdater.on('download-progress', ({ percent }) => { + console.log('下载进度', percent); + // if (percent < 50) { + // } + this.isUpdate = true; + }); + autoUpdater.on('update-available', (info) => { + if (sendUpdateMsg) return; + const { version, releaseName = 'normal', releaseNotes } = info; + this.lastestVersion = version; + + sendUpdateMsg = true; + + autoUpdater.on('update-downloaded', () => { + console.log('下载完成'); + this.isUpdate = false; + if (releaseName === 'major') { + autoUpdater.quitAndInstall(true, true); + } + const mainWindow = main().getWindow() + dialog + .showMessageBox(mainWindow, { + title: '版本更新', + message: `发现新版本${this.lastestVersion},是否更新\n\n${releaseNotes}`, + type: 'info', + buttons: ['稍后提示', '立即更新'], + }) + .then(({ response }) => { + console.log(response); + if (response === 1) { + this.update(); + } + }); + }); + + // 自动下载安装包 + if (!this.isUpdate) { + autoUpdater.downloadUpdate(); + console.log('download'); + } + }); + autoUpdater.on('update-not-available', (info) => { + if (sendUpdateMsg) return; + sendUpdateMsg = true; + }); + autoUpdater.on('error', () => { + this.isUpdate = false; + }); + } + + checkUpdate(): void { + this.checkForMacAndWindows(); + } + + update() { + let sendUpdateMsg = false; + + this.checkUpdate(); + + autoUpdater.on('update-downloaded', () => { + if (sendUpdateMsg) return; + sendUpdateMsg = true; + this.isUpdate = false; + autoUpdater.quitAndInstall(true, true); + // App.quit(); + }); + } +} + +export default new VersionHandler(); diff --git a/vue.config.js b/vue.config.js index 8c6279f..20bba92 100644 --- a/vue.config.js +++ b/vue.config.js @@ -33,6 +33,13 @@ module.exports = { directories: { output: 'build', }, + // publish: [ + // { + // provider: 'github', + // owner: 'rubickCenter', + // repo: 'rubick', + // }, + // ], // files: ["dist_electron/**/*"], dmg: { contents: [