add windows auto-update feature

This commit is contained in:
layyback 2023-06-24 22:49:22 +08:00
parent 2eff73f581
commit 6ea706127d
5 changed files with 131 additions and 18 deletions

View File

@ -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
}
}

View File

@ -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,
};
};

View File

@ -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, {

View File

@ -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();

View File

@ -33,6 +33,13 @@ module.exports = {
directories: {
output: 'build',
},
// publish: [
// {
// provider: 'github',
// owner: 'rubickCenter',
// repo: 'rubick',
// },
// ],
// files: ["dist_electron/**/*"],
dmg: {
contents: [