注意事项:
- 设置了feedURL后,会有默认的 查询是否有更新以及下载更新包的地址;
// 设置以下feedUrl,会自动去 'http://127.0.0.1:8090/win32/RELEASES?version='+app.getVersion() 路径获取是否有更新
// 若有更新,会返回响应的RELEASE信息,如:396E41B96C1222461AB5D9653AA77825343B2D41 electron-quick-start-1.0.0-full.nupkg 86878690
// 接着会自动去 http://127.0.0.1:8090/win32/electron-quick-start-1.0.0-full.nupkg 路径获取最新安装包
// 一般会重定向获取最新安装包的路径到 s3 或 静态文件服务
autoUpdater.setFeedURL('http://127.0.0.1:8090/win32?version=' + app.getVersion())
2、安装包不能使用nsis,需要使用Squirrel,更新需要Squirrel配置的nupkg包。
3、需执行npm i electron-squirrel-startup -S,在主进程开始加上 if (require('electron-squirrel-startup')) return。
4、打包后,主进程中的console.log无法查看,需要使用 electron-log 等日志工具将信息写入文件,以此调试更新。
项目简析:
1、在主进程中引入更新的逻辑,一般写在 will-finish-launching 钩子函数中。
// main.js
app.on('will-finish-launching', () => {
if (!isDev) {
require('./updater.js')
}
})
2、更新逻辑
// updater.js
const { app, dialog, autoUpdater } = require("electron")
// const log = require('electron-log');
const { log } = require('./logger')
if (process.platform === 'darwin') {
autoUpdater.setFeedURL('http://127.0.0.1:8090/darwin?version=' + app.getVersion())
} else {
autoUpdater.setFeedURL('http://127.0.0.1:8090/win32?version=' + app.getVersion())
}
autoUpdater.checkForUpdates()
autoUpdater.on('update-available', () => {
log('update-available')
})
autoUpdater.on('update-downloaded', () => {
app.whenReady().then(() => {
let clickId = dialog.showMessageBoxSync({
type: 'info',
title: '升级提示',
message: '已为你升级到最新版,是否立即体验',
buttons: ['马上升级', '手动重启'],
cancelId: 1,
})
if (clickId === 0) {
autoUpdater.quitAndInstall()
app.quit()
}
})
})
autoUpdater.on('error', (error) => {
log(error.toString())
})
3、package.json中的 build 配置
// package.json
"build": {
"appId": "tomatoClock",
"productName": "",
"asar": false,
"directories": {
"output": "dist3"
},
"win": {
"target": [
"squirrel",
"nsis"
]
},
"nsis": {
"oneClick": false,
"language": "2052",
"perMachine": true,
"allowToChangeInstallationDirectory": true
},
"squirrelWindows": {
"iconUrl": "https://raw.githubusercontent.com/dengyaolong/geektime-electron/master/img/icon.ico"
}
},
4、更新服务器
// index.js
const Koa = require('koa')
const app = new Koa()
const Router = require('koa-router')
const serve = require('koa-static-server')
const router = new Router()
const compareVersions = require('compare-versions')
function getNewVersion(version) {
if (!version) return null
let maxVersion = {
name: '1.0.1',
pub_date: '2020-02-01T12:26:53+1:00',
notes: '新增功能AAA',
url: `http://127.0.0.1:8090s/public/Mercurius-1.0.1-mac.zip`
}
if (compareVersions.compare(maxVersion.name, version, '>')) {
return maxVersion
}
return null
}
router.get('/win32/RELEASES', (ctx, next) => {
let newVersion = getNewVersion(ctx.query.version)
console.log('newVersion,', newVersion)
if (newVersion) {
// 动态返回最新的包的信息
ctx.body = '5181F50B0123AFA6CFDA4C73FB667988BD605C0B electron-quick-start-1.1.0-full.nupkg 404590861'
} else {
ctx.status = 204
}
})
router.get('/win32/electron-quick-start-1.1.0-full.nupkg', (ctx, next) => {
ctx.redirect('/public/electron-quick-start-1.1.0-full.nupkg')
})
router.get('/darwin', (ctx, next) => {
// 处理Mac更新, ?version=1.0.0&uid=123
let { version } = ctx.query
let newVersion = getNewVersion(version)
if (newVersion) {
ctx.body = newVersion
} else {
ctx.status = 204
}
})
app.use(serve({ rootDir: 'public', rootPath: '/public' }))
app.use(router.routes())
.use(router.allowedMethods())
app.listen(8090, () => {
console.log('app is listening at 8090')
})