博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ionic App问题总结系列】ionic 如何更新app版本
阅读量:6672 次
发布时间:2019-06-25

本文共 5949 字,大约阅读时间需要 19 分钟。

ionic 如何进行自动更新

 

ionic App更新有两种方式:第一种是普通的从远程下载apk,安装并覆盖旧版本。另外一种就是采用替换www文件夹的内容,实现应用内更新,而无需下载安装apk。 

这篇文章讲的是通过第一种方式,来实现app的更新。 
App更新流程比较简单,如下图: 

这里用到的后端的接口字段如下:

1 {2     "update_flag",    // 更新的flag,一般取值分为不更新,普通更新,强制更新三种3     "url",    // 远程apk下载地址4     "desc",    // 更新描述5     ""6 }

第一步:安装所需要的插件

  • cordova-plugin-network-information
  • cordova-plugin-file
  • cordova-plugin-file-operner2
  • cordova-plugin-file-transfer
  • cordova-plugin-app-version
    1 cordova plugin add cordova-plugin-network-information cordova-plugin-file cordova-plugin-file-operner2 cordova-plugin-file-transfer cordova-plugin-app-version --save

第二步:添加AppUpdateService

我把App更新的逻辑封装在了AppUpdateService中,代码如下:

1 /**  2    * App检查更新 Service  3    */  4   .factory('AppUpdateService', ["$http", "Services", '$q', '$cordovaNetwork', '$cordovaAppVersion', '$ionicPopup', '$ionicLoading', '$cordovaFileTransfer', '$cordovaFileOpener2', '$timeout',  5     function ($http, Services, $q, $cordovaNetwork, $cordovaAppVersion, $ionicPopup, $ionicLoading, $cordovaFileTransfer, $cordovaFileOpener2, $timeout) {  6       return {  7         checkVersionData: checkVersionData,  8         checkVersion: checkVersion,  9       }; 10  11       /** 12        * 调用后端接口获取版本更新信息,这里应该换成你自己的逻辑 13        */ 14       function checkVersionData(data) { 15         var deferred = $q.defer(); 16         $http({method: 'GET', url: Services.CHECK_VERSION.url, params: data}).success(function (data) { 17           deferred.resolve(data.data); 18         }).error(function (err) { 19           deferred.reject(err); 20         }); 21         return deferred.promise; 22       } 23  24  25       function checkVersion(scope) { 26         var deferred = $q.defer(); 27         // params 是我这边需要传递给后端接口的参数,需更改为你自己的参数 28         var params = { 29           platform: 'android', 30           version: '' 31         }; 32         // 获取手机的网络状态,返回的值包括:WIFI CELL_4G CELL_3G等网络状态,这里用来检测手机是否处于WiFi状态 33         var networkType = $cordovaNetwork.getNetwork(); 34  35         // 获取App 内的版本信息 36         $cordovaAppVersion.getVersionNumber().then(function (version) { 37           params.version = version; 38  39           // 获取服务器版本信息,此处需更改为你自己的逻辑 40           checkVersionData(params) 41             .then(function (data) { 42                // 该接口返回的updateFlag取值为:0(不更新)、1(普通更新)、2(强制更新) 43               // 判断是否需要更新 44               if (data.updateFlag) { 45                 var json = { 46                   title: '', 47                   subTitle: data.description 48                 }; 49  50                 // 由于应用内的版本是1.0.0这种格式,所以可以通过正则替换成1.0.0->100,方便进行版本号的比较 51                 var nowVersionNum = parseInt(version.toString().replace(new RegExp(/(\.)/g), '0')); 52  53                 // data.version为后端接口返回的需要更新的新版本号 54                 var newVersionNum = parseInt(data.version.toString().replace(new RegExp(/(\.)/g), '0')); 55                 if (newVersionNum > nowVersionNum) { 56  57                   if (data.updateFlag == 1) {  // 普通更新 58                     if (networkType == 'wifi') { 59                       json.title = 'APP版本更新' 60                     } 61                     else { 62                       json.title = 'APP版本更新(建议WIFI下升级)'; 63                     } 64                     updateAppPopup(json, scope).then(function (res) { 65                       if (res == 'update') { 66                         UpdateForAndroid(data.url); 67                       } 68                     }); 69                   } 70                   else if (data.updateFlag == 2 && type == 'wifi') {  // 强制更新 71                     UpdateForAndroid(data.url); 72                   } 73                 } 74               } 75               deferred.resolve(data.updateFlag); 76             }, function (err) { 77               deferred.reject(null); 78             }) 79         }); 80  81         return deferred.promise; 82       } 83  84       function updateAppPopup(json, scope) { 85         return $ionicPopup.show({ 86           title: json.title, 87           subTitle: json.subTitle, 88           scope: scope, 89           buttons: [ 90             { 91               text: '取消', 92               type: 'button-clear button-assertive', 93               onTap: function () { 94                 return 'cancel'; 95               } 96             }, 97             { 98               text: '更新', 99               type: 'button-clear button-assertive border-left',100               onTap: function (e) {101                 return 'update';102               }103             }104           ]105         });106       }107 108       function UpdateForAndroid(downloadUrl) {109         $ionicLoading.show({110           template: "已经下载:0%"111         });112         var targetPath = "/sdcard/Download/tianmicaifu.apk";113         var trustHosts = true;114         var options = {};115         $cordovaFileTransfer.download(downloadUrl, targetPath, options, trustHosts).then(function (result) {116           $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive'117           ).then(function () {118             // 成功119           }, function (err) {120             console.log(err);121           });122           $ionicLoading.hide();123         }, function (err) {124           $ionicLoading.show({125             template: "下载失败"126           });127           $ionicLoading.hide();128         }, function (progress) {129           $timeout(function () {130             var downloadProgress = (progress.loaded / progress.total) * 100;131             $ionicLoading.show({132               template: "已经下载:" + Math.floor(downloadProgress) + "%"133             });134             if (downloadProgress > 99) {135               $ionicLoading.hide();136             }137           });138         });139       }140 141     }])

第三步:在run()方法中调用

run()中调用AppUpdateService便可以实现App更新了。代码如下:

// 版本更新提醒AppUpdateService.checkVersion($rootScope);
View Code

 

转载于:https://www.cnblogs.com/wfblogs/p/6825483.html

你可能感兴趣的文章