使用nw-autoupdater实现客户端应用的自动升级

前段时间开发了新的需求,要求实现应用的自动检测更新升级。由于客户端是通过nw.js开发的,nw.js的官方文档有三种方法实现自动升级,我选择了nw-autoupdater来实现,具体实现的原理就是:首先从远程服务器读取配置文件;检查远程配置文件中的版本是否大于本地版本;如果远端服务器有最新版本,则下载最新程序包;将下载的安装包解压到一个临时目录,关闭应用程序启动最新版本,重启应用程序。
先看了一下github上的demo,https://github.com/dsheiko/nw-autoupdater,然后开始升级的尝试了。使用node搭建了一个服务器,模拟升级服务器。将github上的项目下载到本地,其他文件不动,直接对package.json文件进行修改配置,将对应的升级包放在配置文件中对应的位置。

接下来就是在项目中添加升级的相关逻辑了。首先在项目中下载依赖包nw-autoupdater。可以直接通过npm install nw-autoupdater –save-dev下载。然后在代码中添加检测版本的方法

    checkBrowserVersion: function () {
    const AutoUpdater = require( "nw-autoupdater" ),
    updater = new AutoUpdater( require( "../package.json" ) );
    async function main(){
    try {
    // Update copy is running to replace app with the update
      if ( updater.isSwapRequest() ) {
         var page = document.getElementById("homePage");
         var pageLoading=document.getElementById("loadingBox");
         page.style.display = "none";
         pageLoading.style.display="block";
         await updater.swap();
         await updater.restart();
         return;
        }
    // Download/unpack update if any available
    const rManifest = await updater.readRemoteManifest();
    const needsUpdate = await updater.checkNewVersion( rManifest );
      if ( !needsUpdate ) {
         return;
      }
      if (!confirm( $translate.instant('IDS_UPDATE_ALERT'))){
         return;
      }
      // Subscribe for progress events
      updater.on( "download", ( downloadSize, totalSize ) => {
        console.log( "download progress", Math.floor( downloadSize / totalSize * 100 ), "%" );
      });
      updater.on( "install", ( installFiles, totalFiles ) => {
        console.log( "install progress", Math.floor( installFiles / totalFiles * 100 ), "%" );
      });
      const updateFile = await updater.download( rManifest );
      await updater.unpack( updateFile );
      alert( $translate.instant('IDS_UPDATE_RESTART'));
      updater.restartToSwap(rManifest);
    } catch ( e ) {
        console.error( e );
        }
    }
      setTimeout(function () {
        main();
      }, updater.isSwapRequest()?0:1000);
    }

如果不出意外的话,自动升级就可以实现了,在这里需要注意的是,升级包必须是压缩格式的,但不直接是最新安装包。在osx中,升级包是直接最新版本的.app文件压缩;在windwos系统中,升级包是安装成功后打开所在文件夹根目录下的所有文件。

你可能感兴趣的:(使用nw-autoupdater实现客户端应用的自动升级)