【ionic App问题总结系列】ionic 如何更新app版本

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

 

posted on 2017-05-08 16:00  石门老猿  阅读(3094)  评论(0编辑  收藏  举报

导航