windows 更新实践

注意事项:

  1. 设置了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')
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容