ionic App更新有兩種方式:第一種是普通的從遠程下載apk,安裝並覆蓋舊版本。另一種就是採用替換www
文件夾的內容,實現應用內更新,而無需下載安裝apk。
這篇文章講的是經過第一種方式,來實現app的更新。
App更新流程比較簡單,以下圖: android
這裏用到的後端的接口字段以下:json
1 { 2 "update_flag", // 更新的flag,通常取值分爲不更新,普通更新,強制更新三種 3 "url", // 遠程apk下載地址 4 "desc", // 更新描述 5 "" 6 }
1 cordova plugin add cordova-plugin-network-information cordova-plugin-file cordova-plugin-file-operner2 cordova-plugin-file-transfer cordova-plugin-app-version --save
我把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);