HTML5进阶(三)HBuilder实现软件自动升级(优化篇)

举报
SHQ5785 发表于 2020/12/30 01:14:34 2020/12/30
3.2k+ 0 0
【摘要】 HBuilder实现软件自动升级(优化篇) 前言 受前篇博客《HTML5进阶(二)HBuilder实现软件自动升级》(点击查看详情)的影响,测试过程中发现APP自动更新还是存在问题,第一次升级没有任何问题。第二次升级时,若wrt升级包的名字相同,则会出现以下错误提示:         估计是HBuilder的BUG导致出现以上错误。受社区中盆友们思路的启发,在每次更新...

HBuilder实现软件自动升级(优化篇)

前言

受前篇博客《HTML5进阶(二)HBuilder实现软件自动升级》(点击查看详情)的影响,测试过程中发现APP自动更新还是存在问题,第一次升级没有任何问题。第二次升级时,若wrt升级包的名字相同,则会出现以下错误提示:

 

      估计是HBuilder的BUG导致出现以上错误。受社区中盆友们思路的启发,在每次更新时提交不同文件名的wrt更新包,方可解决以上问题。

      同时在上篇博客中提到“检测更新更好的模式应该是客户端提交本地应用资源版本号到升级服务器,由升级服务器判断是否可更新并且返回App升级资源包下载地址,避免在客户端写资源下载地址;”。由此,自己由本地检测版本更新变更为将本地app版本提交至升级服务端,由服务端判断app是否可更新,若存在更新版本则返回相应的新版本号及版本下载地址。

      在提交新版本时,应注意版本号的一致性,即wrt版本号、版本号文件version.txt中的版本号相一致。

客户端源码(拿走不谢)


      var wgtVer  = null;
      function plusReady(){
      // 获取本地应用资源版本号
      plus.runtime.getProperty(plus.runtime.appid,function(inf){
      wgtVer = inf.version;
      localStorage.setItem('newVer', wgtVer);
      console.log(localStorage.getItem('newVer'));
      console.log("当前应用版本:" + wgtVer);
      /*alert( "国际移动设备身份码IMEI: " + plus.device.imei );
      alert( "国际移动用户识别码IMSI: " + plus.device.imsi );
      alert( "设备唯一标识号uuid: "+plus.device.uuid );*/
      console.log("=============版本测试=============");
      var version = {
      'version': wgtVer
      };
      appCallServer($http, "9104", version,
      function(data) {
      console.log("9104_版本查询成功" + JSON.stringify(data));
      // H5 plus事件处理,弹出提示信息对话框
      plus.nativeUI.confirm("\"立马送药\"检测到新版本,是否更新?", function(e) {
      if (e.index == 0) {
      console.log("确定更新!");
      downWgt(data.newVersion, data.url); // 下载升级包
      }
      }, " 立马送药", ["确定", "取消"]);
      }, function(data) {
      /*$ionicLoading.show({
      template: '测试'
      });
      $timeout(function() {
      $ionicLoading.hide();
      }, 1200);*/
      });
      });
      }
      if(window.plus){
      plusReady();
      }else{
      document.addEventListener('plusready',plusReady,false);
      }
      // 下载新版本
      function downWgt(newVer, wgtUrl){
      plus.nativeUI.showWaiting("下载wgt文件...");
      plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){
      if ( status == 200 ) {
      console.log("下载wgt成功:"+d.filename);
      installWgt(d.filename,newVer);// 安装wgt包
      } else {
      console.log("下载wgt失败!");
      plus.nativeUI.alert("下载wgt失败!");
      }
      plus.nativeUI.closeWaiting();
      }).start();
      }
      // 更新应用资源
      function installWgt(path,newVer){
      plus.nativeUI.showWaiting("安装wgt文件...");
      // force:false进行版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败
      plus.runtime.install(path,{force:false},function(){
      plus.nativeUI.closeWaiting();
      console.log("安装wgt文件成功!");
      localStorage.setItem('newVer', newVer);
      // H5 plus事件处理,弹出提示信息对话框
      plus.nativeUI.confirm("应用资源更新完成,是否重新打开应用?", function(e) {
      if (e.index == 0) {
      console.log("确定重新打开应用!");
      plus.runtime.restart();
      }
      }, " 立马送药", ["确定", "取消"]);
      },function(e){
      plus.nativeUI.closeWaiting();
      console.log("安装wgt文件失败[" + e.code + "]:" + e.message);
      plus.nativeUI.alert("安装wgt文件失败[" + e.code + "]:" + e.message);
      });
      }
  
 

服务端源码(拿走不谢)


      // check version 
      public static boolean do_9104(RequestMessage request,ResponseMessage response) {
      logger.info("\n\n------------Check_APP_Version_9104 debug info-------------\n请求数据包信息:" + request.json.toString());
      String version = request.getString("version").trim();
      String currentVersion = FileUtil.readFile(MyConst.VERSION_FILE_PATH).replaceAll("null","").trim();
      logger.info("当前APP版本:[" + currentVersion + "]");
      if(!version.isEmpty() && !currentVersion.isEmpty() && (!version.equals(currentVersion))){
      response.json.element("newVersion", currentVersion); 	 // 返回最新版本
      response.json.element("url", MyConst.WGT_URL + currentVersion + ".wgt"); // 返回wgt文件下载地址
      }else if(!version.isEmpty() && !currentVersion.isEmpty() && (version.equals(currentVersion))){
      response.result = MyConst.ERR_VERSION_SAME;
      response.errtext = "当前已是最新版本";
      }else{
      response.result = MyConst.ERR_VERSION;
      response.errtext = "版本信息查询失败";
      return (false);
      }
      return true;
      }
  
 

优化

      在上面的app版本管理中,更新包及版本控制文件version.txt均需要手动添加、更改,这一体验令人极为不爽,遂决定进一步优化之~

      为了进一步方便管理人员对版本控制的操作。在管理端进一步增加通过程序增加更新包的功能模块,该功能模块能够实现更新包的上传,同时将新的版本号写入version.txt版本文件中。

参考文献

http://blog.csdn.net/sunhuaqiang1/article/details/50804397

美文美图

 

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/50903317

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。