问题描述:启动APP时检测是否有新版本需要更新,提示进行更新
解决思路:
1.从服务器获取版本号,与当前app版本的版本号进行比较,若不相同,则进行更新,相同直接跳过,进入登录界面
解决步骤:
① 安装好ionic开发环境,像JDK,SDK,nodejs...就不多说了,自己去百度
② 安装相关插件
版本信息:ionic plugin add cordova-plugin-app-version
文件管理:ionic plugin add cordova-plugin-file
文件传输:ionic plugin add cordova-plugin-file-transfer
打开文件:ionic plugin add cordova-plugin-file-opener2
③ 在服务器端配置好版本号,拿到版本号,通过
$cordovaAppVersion.getVersionNumber().then(function(version) {
alert(version);
}
方法获取到app版本号,与之进行比对
④ 从服务器下载新版app
/**
* url : 服务器下载路径
* targetPath : 存储路径
* trustHosts : 如果设置为true,接受所有安全证书
* options : 可选参数
* @type {string}
*/
var url = "http://192.168.1.23:8080/app/android-debug.apk";
var targetPath = "file:///mnt/sdcard/Download/android-debug.apk";
var trustHosts = true;
var options = {};
// 从服务器下载
$cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) {
// 下载完成
}, function (err) {
alert('下载失败');
}, function (progress) {
// progress进度
});
⑤ 下载完成之后打开安装包,重新安装$cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive').then(function () {
ionic.Platform.exitApp();
}, function (err) {
alert("安裝包打開失敗");
});
按正常来说这样就结束了对吧?但是忘了一个非常重要的问题,就是手机权限问题,我们需要获取手机的读写权限,联网权限,否则在更新安装包时会下载失败,我在测试时就出现过这样一个问题,因为我手机默认读写权限是放开的,所以我在完成上述步骤之后就能正常更新了,但是到了别人的手机上就会出现下载失败的情况,测试花费了两个小时,所以重点提醒一下,以后有类似的读写操作,不要忘记在读写操作之前申请手机权限
获取权限首先需要添加 权限插件:cordova plugin add cordova-plugin-android-permissions,(Android6.0之后获取权限都需要动态获取,ionic提供了此插件)
获取权限代码如下:
// 权限组,当然也可以是单个权限
var permissionGroup = [
permissions.WRITE_EXTERNAL_STORAGE,
permissions.READ_EXTERNAL_STORAGE,
permissions.INTERNET
];
// 检验是否拥有权限
permissions.hasPermission(permissionGroup, function(status){
if(!status.hasPermission ) {
// 请求权限
permissions.requestPermissions(permissionGroup,function(status) {
if(status.hasPermission) {
// 请求完成之后.....
} else {
$timeout(function(){
$ionicLoading.show({
template:"请求权限失败,请手动开启"
})
}, 3000);
}
},function(err){
alert("requestPermissions,false");
});
}
else {
installationPackage();
}
}, function(){
alert("hasPermission,false");
});
以上就是所有用到方法的解释说明,完整代码如下:
angular.module('starter', ['ionic', 'starter.controllers', 'starter.services', 'ngCordova'])
.run(function($ionicPlatform, $cordovaAppVersion, $cordovaFileTransfer, $cordovaFileOpener2, $ionicLoading, $cordovaNetwork, $timeout) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
var permissions = cordova.plugins.permissions;
/**
* url : 服务器下载路径
* targetPath : 存储路径
* trustHosts : 如果设置为true,接受所有安全证书
* options : 可选参数
* networkType : 网络状态(4G,WiFi)
* @type {string}
*/
var url = "http://192.168.7.23:8080/app/android-debug.apk";
var targetPath = "file:///mnt/sdcard/Download/android-debug.apk";
var trustHosts = true;
var options = {};
var networkType = $cordovaNetwork.getNetwork();
var permissionGroup = [
permissions.WRITE_EXTERNAL_STORAGE,
permissions.READ_EXTERNAL_STORAGE,
permissions.INTERNET
];
// 检验是否拥有权限
permissions.hasPermission(permissionGroup, function(status){
if(!status.hasPermission ) {
// 请求权限
permissions.requestPermissions(permissionGroup,function(status) {
if(status.hasPermission) {
installationPackage();
} else {
$timeout(function(){
$ionicLoading.show({
template:"请求权限失败,请手动开启"
})
}, 3000);
}
},function(err){
alert("requestPermissions,false");
});
}
else {
installationPackage();
}
}, function(){
alert("hasPermission,false");
});
// 下載最新安裝包
function installationPackage() {
$cordovaAppVersion.getVersionNumber().then(function(version) {
// 獲取服務器版本號,暂定服务器版本号为1.0.0.1
var serverVersion = '1.0.0.1';
if (serverVersion != version) {
$ionicPopup.confirm({
title: '更新',
template : "檢測到當前版本不是最新版本,是否更新?"
}).then(function (res) {
if(!res){
ionic.Platform.exitApp();
}else {
// 初始下载进度
$ionicLoading.show({
template: "已经下载:0%"
});
// 从服务器下载
$cordovaFileTransfer.download(url, targetPath, options, trustHosts).then(function (result) {
$cordovaFileOpener2.open(targetPath, 'application/vnd.android.package-archive').then(function () {
ionic.Platform.exitApp();
}, function (err) {
alert("安裝包打開失敗");
});
$ionicLoading.hide();
}, function (err) {
alert('下载失败');
ionic.Platform.exitApp();
}, function (progress) {
$timeout(function () {
var downloadProgress = (progress.loaded / progress.total) * 100;
$ionicLoading.show({
template: "已经下载:" + Math.floor(downloadProgress) + "%"
});
if (downloadProgress > 99) {
$ionicLoading.hide();
}
});
});
}
});
}
else {
// $state.go('login');
}
});
}
});
})