ionic app 安卓版自動更新
阿新 • • 發佈:2019-02-15
準備工作
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);
});
}
}
}])