逻辑:
利用cordova组件检测到当前app的版本
cordova检测版本是根据config.xml配置文件中的
version来检测的
请求接口获取服务端配置的最新版的app版本
比较二者的大小,若本地app版本小于服务器版本
则调用cordova插件去下载服务器地址上的apk文件
下载完成后安装即可
分步代码
安装cordova插件
//获取app版本号
cordova plugin add cordova-plugin-app-version
//提供一个临时存储文件的地方
cordova plugin add cordova-plugin-file
//实现上传下载
cordova plugin add cordova-plugin-file-transfer
//下载后打开
cordova plugin add cordova-plugin-file-opener2
首页写getNativeVersion方法:
getNativeVersion() {
window.cordova.getAppVersion.getVersionNumber().then(function(version) {
localStorage.setItem("version", version);
checkUpgrade(version);
});
},
checkUpgrade方法:
/*
* 检测升级方法
*/
export function checkUpgrade(locationVersion) {
/**
* 从服务器获取应用的版本信息,和本地应用版本对比
*/
getAppVersion({
method: "post"
}).then(response => {
if(response != null){
console.log(response.data)
var serverVersion = response.data.appVersion;
var locationVersionNum = parseInt(locationVersion.replace(/\./g,""))
var serverVersionNum = parseInt(serverVersion.replace(/\./g,""))
if(locationVersionNum < serverVersionNum){
Dialog.confirm({
title: '发现版本: ' + serverVersion + ',请进行升级',
message: '建议您在WIFI环境下升级',
}).then(() => {
// on confirm
upgradeForAndroid()
}).catch(() => {
// on cancel
navigator.app.exitApp();
});
}
}
})
// 监听网络状况,无网络时
document.addEventListener('offline', function () {
alert("网络异常,不能连接到服务器!");
Dialog.alert({
title:"网络异常,不能连接到服务器!",
message:"请在连接网络的情况下升级应用"
}).then(() => {
navigator.app.exitApp();
})
}, false);
}
upgradeForAndroid方法:
// 检测新版本升级
export function upgradeForAndroid(releasePath, packageName) {
//从window中获取Cordova对象
var cordova = window.cordova
//apk所在的服务器路径(下载路径)
var url = "http://oa.szwzkeji.com/Public/Download/biggift.apk";
var targetPath = cordova.file.externalDataDirectory + "biggift.apk"; //要下载的目标路径及文件名(本地存储路径)
var trustHosts = true;
var options = {};
// alert("url:" + url);
// alert("targetPah:" + targetPath);
// alert("trustHost:" + trustHosts);
downLoadApp();
function downLoadApp() {
// 初始化FileTransfer对象
// eslint-disable-next-line no-undef
var fileTransfer = new FileTransfer();
fileTransfer.onprogress = function (progressEvent) {
if (progressEvent.lengthComputable) {
var downloadProgress = (progressEvent.loaded / progressEvent.total) * 100;
var result = "已下载:" + Math.floor(downloadProgress) + "%";
if(Math.floor(downloadProgress) == 100){
Dialog.alert({
title: result,
message:"下载完成后会自动弹出安装",
showConfirmButton:false,
showCancelButton:true
}).then(
).catch(() => {
// on cancel
navigator.app.exitApp();
})
}else{
Dialog.alert({
title: result,
message:"下载完成后会自动弹出安装",
showConfirmButton:false,
showCancelButton:false
})
}
}
};
// 调用download方法
fileTransfer.download(
url, //uri网络下载路径
targetPath, //url本地存储路径
function (entry) {
// alert("开始执行downLoadApp",entry);
// alert(targetPath);
// alert("download complete: " + entry.toURL());
cordova.plugins.fileOpener2.open(
targetPath,
'application/vnd.android.package-archive',
{
error: function (e) {
alert('Error status: ' + e.status + ' - Error message: ' + e.message);
Dialog.alert({
title: "打开下载文件失败",
message:"请退出后重新进入应用",
}).then(res => {
navigator.app.exitApp();
})
},
success: function () {
// console.log('open successfully');
// alert('open successfully');
}
})
},
function (error) {
// AlertModule.show({ title: "下载失败" })
alert("download error source " + error.source);
alert("download error target " + error.target);
alert("upload error code" + error.code);
}
);
}
}
总结:
主要都是用cordova插件实现的,所以很重要的就是那几个插件的引入
自己的js逻辑代码可以封装在utils工具js类中方便调用
每次新版本重新签名打包的时候一定要记得手动修改config.xml配置最新的apk版本上传服务器并手动修改服务器的版本号
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。