准备工作
ngcordova 插件:
- 文件管理插件:cordova plugin add cordova-plugin-file
- 文件传输插件:cordova plugin add cordova-plugin-file-transfer
- 文件打开插件:cordova plugin add https://github.com/pwlin/cordova-plugin-file-opener2.git
- app版本获取插件:cordova plugin add https://github.com/whiteoctober/cordova-plugin-app-version.git
获取服务器上的版本号
得到服务器上的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);
});
}
}
}])