在用户已经安装过app ,下次进入自动检查是否有新版本需要升级更新!借用了uniapp 插件市场的热更新升级插件。
uniapp升级插件
新建一个文件 updateVersion.js
function check(param = {}) {
// 合并默认参数
param = Object.assign({
title: "检测到有新版本!",
content: "请升级app到最新版本!",
canceltext: "暂不升级",
oktext: "立即升级"
}, param)
if (!param.api) {
return false;
}
plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
// console.log('version=' + widgetInfo.version);
//获取版本信息
let platform = plus.os.name.toLocaleLowerCase()
// widgetInfo.version = '1.0.0'
uni.request({
url: param['api'] + '?token=' + uni.getStorageSync('login_token'),
data: {
platform: platform, //获取的手机的版本ios 还是android
version: widgetInfo.version, //获取的版本信息
'from': param['from'],
},
header: param['header'],
method: 'GET',
dataType: 'json',
success: (result) => {
let data = result.data ? result.data : null
// console.log('result.data===', result.data)
if (data && data.code == 0 && data.url) {
// if(/\.wgt$/i.test(data.url) || (platform == 'android' && /\.apk$/i.test(data.url)))
if (platform == 'android' && data.url.includes("apk")) {
// 如果是热更新 wgt 或 android平台下apk
startdownload(param, data);
return
}
if (platform == 'ios') {
// 如果是ios,则跳转到appstore
uni.showModal({
title: param.title,
content: data.log ? data.log : param.content,
// showCancel: data.force ? false : true,
// confirmText: param.oktext,
showCancel: false,
buttonText: param.oktext,
// cancelText: param.canceltext,
success: res => {
if (!res.confirm) {
console.log('取消了升级');
return
}
plus.runtime.openURL(data.url)
}
})
return;
}
}
},
fail: (res) => {
console.log('fail', res)
}
})
});
}
function startdownload(param, data) {
// console.log('准备升级222')
uni.showModal({
title: param.title,
content: data.log ? data.log : param.content,
showCancel: data.force ? false : true,
confirmText: param.oktext,
cancelText: param.canceltext,
success: res => {
if (!res.confirm) {
console.log('取消了升级');
return
}
if (data.url.includes("apk")) {
//去应用市场更新
plus.runtime.openURL(data.shichangurl);
plus.runtime.restart();
} else {
// 开始下载
// 创建下载任务
var dtask = plus.downloader.createDownload(data.url, {
filename: "_downloads/"
},
function(d, status) {
console.log('d', d)
console.log('status', status);
// 下载完成
if (status == 200) {
plus.runtime.install(d.filename, {
force: false
}, function() {
//进行重新启动;
plus.runtime.restart();
}, (e) => {
uni.showToast({
title: '安装升级包失败:' + JSON.stringify(e),
icon: 'none'
})
});
} else {
uni.showToast({
title:"下载升级包失败,请手动去站点下载安装,错误码: " + status,
icon:'none'
})
// this.tui.toast("下载升级包失败,请手动去站点下载安装,错误码: " + status);
}
});
let view = new plus.nativeObj.View("maskView", {
backgroundColor: "rgba(255,255,255,.2)",
left: ((plus.screen.resolutionWidth / 2) - 45) + "px",
bottom: "80px",
width: "90px",
height: "30px"
})
view.drawText('开始下载', {}, {
size: '14px',
color: '#000000'
});
view.show()
dtask.addEventListener("statechanged", (e) => {
if (e && e.downloadedSize > 0) {
let jindu = ((e.downloadedSize / e.totalSize) * 100).toFixed(2)
view.reset();
view.drawText(jindu + '%', {}, {
size: '14px',
color: '#000000'
});
}
}, false);
dtask.start();
}
}
});
}
export default {
check
}
在app.vue里面
import checkappupdate from 'common/updateVersion.js'
checkappupdate.check({
title:"检测到有新版本!",
content:"请升级app到最新版本!",
canceltext:"暂不升级",
oktext:"立即升级",
api:'/apiv2/fire-system-api/system/configer/update', //请求后台的api
'from':"apple", // 分辨平台apple //huawei //web
header:header //需要传给后台的请求头部自定义
})
后台返回 数据 。存在新wgt 或android 平台下apk
苹果返回 https://apps.apple.com/cn/app/%E7%BA%A2%E8%B1%A1%E8%B5%9B%E4%BA%8B/idxxxxx
{
code:0
msg:"ok"
version:1.2.1//版本号
url:'http...apk|wgt'//url下载地址,wgt优先,如果不存在新wgt,并且是ios,则此处为AppStore的地址
log:''//更新文字说明,支持 \n 换行
force:1// 是否强制升级,force=1则是强制升级,用户无法关闭升级提示框
}
如果不存在新apk或wgt,则返回
{
code:1,
msg:"no"
}