【ionic App問題總結系列】ionic 如何更新app版本

ionic 如何進行自動更新

 

ionic App更新有兩種方式:第一種是普通的從遠程下載apk,安裝並覆蓋舊版本。另一種就是採用替換www文件夾的內容,實現應用內更新,而無需下載安裝apk。 
這篇文章講的是經過第一種方式,來實現app的更新。 
App更新流程比較簡單,以下圖: android

這裏用到的後端的接口字段以下:json

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更新了。代碼以下:promise

// 版本更新提醒
AppUpdateService.checkVersion($rootScope);
View Code
相關文章
相關標籤/搜索