主要是拿本地的版本号和后端返回的版本号做对比(在每次修改完代码以后,要打个更新包或者整包给后端喔)
<template>
<view>
<sxPopup ref="appUpdate" @closeMaks="closeMaks">
<view class="update-main">
<image src="/static/images/update_close.png" class="update-close" @tap="hide"></image>
<view class="update-content">
最新安装包已准备就绪恭请主人体验尝
</view>
<view class="update-btn btn-solid" @tap="updateApp">
立即体验
</view>
</view>
</sxPopup>
</view>
</template>
在data中定义
version:"", // 当前版本
serverVersion:"", // 服务器版本
clientType:'', // 客户端类型
updateInfo:{}, // 更新信息
curDownSize:0, // 当前下载大小
在props中
autoChangeUpdate:{ // 是否自动检测更新
type:Boolean,
default:false
}
mounted() {
_this = this;
this.changeUpdate()
},
在methods中
show(){
//显示更新弹窗
this.$refs.appUpdate.open()
},
hide(){
//隐藏更新弹窗
uni.showTabBar();
this.$refs.appUpdate.close()
},
changeUpdate(){ // 检测更新
//如果父组件选择自动更新
if(this.autoChangeUpdate){
this.getServerVersion()
}
},
isUpdate(curVersion,serVersion){ // 判断是否需要更新
let [serArray,curArray] = [serVersion.split("."),curVersion.split(".")]
if(parseInt(serArray[0]) > parseInt(curArray[0])){
return true
}else if(parseInt(serArray[1]) > parseInt(curArray[1])){
return true
}else if(parseInt(serArray[1]) >= parseInt(curArray[1]) && parseInt(serArray[2]) > parseInt(curArray[2])){
return true
}else{
return false
}
},
computedVersion(version){ // 计算版本
let array = version.split(".");
let sum = 0;
sum += array[0]*10
sum += array[1]+array[2]
return sum;
},
getServerVersion(){ // 获取服务器版本
if(!this.autoChangeUpdate){
uni.showLoading({
title:"检测更新"
})
}
this.$ajax("index/apiUpdateVersion",{}).then(res=>{
uni.hideLoading()
if(res.code == 200){
this.updateInfo = res.data
plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) {
// 获取当前app版本
_this.version = wgtinfo.version;
console.log(uni.getSystemInfoSync().platform)
// 判断手机类型
switch (uni.getSystemInfoSync().platform) {
case 'android':
if (_this.isUpdate(_this.version,res.data.android_version)) {
_this.serverVersion = res.data.android_version;
_this.clientType = 'android'
_this.show()
uni.hideTabBar();
}else{
if(!_this.autoChangeUpdate){
_this.$toast("当前已是最新版本")
}
}
break;
case 'ios':
if (_this.isUpdate(_this.version,res.data.ios_version)) {
_this.serverVersion = res.data.ios_version;
_this.clientType = 'ios'
_this.show()
uni.hideTabBar();
}else{
if(!_this.autoChangeUpdate){
_this.$toast("当前已是最新版本")
}
}
break;
}
// _this.$emit('isUpdata',false)
});
}else{
this.$toast(res.data.msg)
}
})
},
updateApp(){ // 更新app
let version = this.version.split('.');
let updateVersion = this.serverVersion.split('.');
this.hide()
// 大更新
if (parseInt(updateVersion[0]) > parseInt(version[0])) {
if(_this.clientType == 'android'){
console.log(_this.clientType)
console.log(this.updateInfo.android_url)
this.downApp(this.updateInfo.android_url,'bigUpdate');
}else{
plus.runtime.openURL(this.updateInfo.ios_url)
}
} else if (parseInt(updateVersion.join('.').replace(/\./g, '')) > parseInt(version.join('.').replace(/\./g, ''))) { //小更新
// 热更新
this.downApp(this.updateInfo.hot_update,'thermalRenewal');
}
},
downApp(url,updateType){
// 文件大小
let fileSize = '';
if(updateType == 'bigUpdate'){
fileSize = this.updateInfo.android_url_file_size;
}else{
fileSize = this.updateInfo.hot_update_file_size;
}
fileSize = parseFloat(fileSize) * 1024 * 1024
console.log(fileSize)
let waiting = plus.nativeUI.showWaiting('下载中...');
// 创建下载任务
let dtask = plus.downloader.createDownload(url,{
filename: '_doc/update/' // 文件下载保存路径
},function(d, status) {
console.log(status,5555)
if (status == 200) {
console.log(status,'.............')
waiting.setTitle('安装中...');
// 下载成功
plus.runtime.install(d.filename, {}, function() {
plus.nativeUI.closeWaiting();
plus.nativeUI.alert('更新完成!', function() {
uni.showTabBar();
// 清除所有下载的包
plus.downloader.clear(-1);
// 热更新自动安装
if(updateType == 'thermalRenewal'){
plus.runtime.restart();
}
});
}, function(e) {
plus.nativeUI.closeWaiting();
plus.nativeUI.alert('安装失败[' + e.code + ']:' + e.message);
});
} else {
//下载失败
plus.nativeUI.alert('下载失败!');
setTimeout(()=>{
plus.nativeUI.closeWaiting();
},1000)
if(updateType == 'bigUpdate'){
plus.runtime.openURL(url) //打开网页手动下载
}
}
})
// 监听下载状态
// dtask.addEventListener("statechanged", function(download, status) {
// // console.log(`监听:下载状态${status}`)
// if (status == 200) {
// let i = download.downloadedSize
// i *= 100 / fileSize;
// console.log(`监听:下载大小${i}`)
// if(!isNaN(i)){
// i = parseInt(i)
// waiting.setTitle('已下载 ' + i + "%");
// // waiting.setTitle(i);
// }
// }else if(status == 404){
// plus.nativeUI.closeWaiting();
// plus.runtime.toast("下载地址错误")
// }
// }, true);
dtask.start();
}