1. 程式人生 > >ionic app 安卓版自動更新

ionic app 安卓版自動更新

準備工作

ngcordova 外掛:

獲取伺服器上的版本號

得到伺服器上的apk的versionCode後,使用$cordovaAppVersion獲取當前執行的apk的versionCode後,將兩者進行比較。

$http.get(url)
   .then(function (success) {
     var data = success.data;
     var serverCode = data.versionCode;
     $cordovaAppVersion.getVersionCode()
       .then(function (version)
{
// 返回伺服器上的versionCode與本地versionCode是否一致 deferred.resolve(version != serverCode); }, false) }, function (error) { deferred.reject(error); });

下載apk,並更新安裝

提示是否更新

var confirmPopup = $ionicPopup.confirm({
    title: '<strong>提示</strong>',
     template: '發現新版本,是否更新?'
, okText: '確認', cancelText: '取消' }); confirmPopup .then(function (res) { if (res) { Download.updateAPK(); } }); }

檔案下載服務,我的安卓專案的包路徑中包含了數字,不知道是不是因為這個原因,將apk下載到 cordova.file.dataDirectory下,一執行就報:”解析軟體包時出現問題”,後面,將apk下載至其他目錄成功升級。

.factory('Download', [
    '$cordovaFile'
, '$cordovaFileTransfer', '$cordovaFileOpener2', '$q', 'Util', '$timeout', 'Android_MIME_MapTable', 'SystemConstant', '$ionicLoading', function ($cordovaFile, $cordovaFileTransfer, $cordovaFileOpener2, $q, Util, $timeout, Android_MIME_MapTable, SystemConstant, $ionicLoading) { // 下載目錄 var downloadPath; return { /** * 初始化app的下載目錄 */ initDownloadDirectory: function () { /** * cordova.file.dataDirectory 不同平臺對應位置如下 * android:'data/data/<app-id>/files/' * IOS:'/var/mobile/Applications/<UUID>/Library/NoCloud/' */ /** * 因android平臺,apk型別的檔案放到cordova.file.dataDirectory下,將無法正常安裝 * 因此,針對不同平臺,使用不同的下載目錄 */ if (ionic.Platform.isAndroid()) { // 初始化android平臺的下載目錄 downloadPath = cordova.file.externalRootDirectory + ''app_download_path''; this.createDir(cordova.file.externalRootDirectory, 'app_download_path') .then(function (success) { downloadPath = success.nativeURL; }, false); } else { // 初始化IOS平臺的下載目錄 downloadPath = cordova.file.dataDirectory + 'app_download_path'; this.createDir(cordova.file.dataDirectory, 'app_download_path') .then(function (success) { downloadPath = success.nativeURL; }, false); } }, /** * 建立目錄 * @param path 目錄 * @param directory 目錄名稱 */ createDir: function (path, directory) { var deferred = $q.defer(); $cordovaFile.createDir(path, directory, false) .then(function (success) { deferred.resolve(success); console.log("目錄建立成功!" + angular.toJson(success)); }, function (error) { deferred.reject(error); console.log("目錄建立失敗!" + angular.toJson(error)); }); return deferred.promise; }, /** * 檔案下載 * @param url 資源定位 * @param targetPath 檔案儲存位置 * @returns {Promise} */ download: function (url, targetPath) { var deferred = $q.defer(); // 允許所有安全證書 var trustAllHosts = true; // 選項 var options = {}; $ionicLoading.show({template: "已經下載0%"}); $cordovaFileTransfer.download(url, targetPath, options, trustAllHosts) .then(function (success) { $ionicLoading.hide(); deferred.resolve(success); }, function (error) { deferred.reject(error); }, function (progress) { $timeout(function () { var downloadProgress = (progress.loaded / progress.total) * 100; $ionicLoading.show({template: "已經下載" + Math.floor(downloadProgress) + "%"}); if (downloadProgress > 99) { $ionicLoading.hide(); } }); }); return deferred.promise; }, /** * 更新apk */ updateAPK: function () { var deferred = $q.defer(); var url = "http://yourServceAddress/your.apk"; var targetPath = downloadPath + "/" + 'your.apk'; this.download(url, targetPath) .then(function () { // 使用外掛開啟apk檔案 $cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive') .then(function (success) { console.log(angular.toJson(success)); deferred.resolve(success); }, function (error) { console.log(angular.toJson(error)); deferred.reject(error); }); }, function (error) { deferred.reject(error); }); } } }])