启动APP时,需要一个接口提供是否有APP包更新,通过接口返回更新包的版本号、更新地址进等信息,通过获取app包版本号与更新包的版本号进行比较来进行更新。
一、发布蒲公英平台,进行实时APP更新(方案一)
1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})。
2、通过蒲公英api, 检测App是否有更新 接口获取APP更新内容,蒲公英 - 文档中心 - API 2.0
appKey值是APP唯一的key
3、用户版本号小于升级包版本号,先升级。
直接上代码:封装的方法可直接调用
export function checkUpdateApp() {
// 获取manifest.json里的配置信息
plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
// 可以根据manifest.json里的应用名称来进行针对性的APP升级
if (widgetinfo.name == 'xxxx') { //APP名称
uni.request({
url: 'https://www.pgyer.com/apiv2/app/check', //检测App是否有更新
data: {
_api_key: '', //API 用户自己的Key
appKey: '' //App应用的唯一Key
},
success: check => {
console.log('check', check.data);
if (check.statusCode == 200 && check.data.code == 0 && check.data.data) {
console.log('1234');
let data = check.data.data;
console.log('data', data);
let version = widgetinfo.version, //用户当前版本
appVersion = data.buildVersion, //升级包版本
appName = widgetinfo.name, //app名称
// updata = data.apk_client_force_updata,//是否强制热更新
appurl = data.downloadURL, //升级包地址
intro = '发现新的《瑞金田长》APP,需要更新APP'; //升级包提示
// wgt_version = data.wgt_version,//热更新版本号
// wgt_download = data.wgt_download;//热更新地址
//如果用户版本号小于升级包版本号,先升级
if (data && version < appVersion) {
uni.showModal({
title: '更新提示',
confirmText: '立即升级',
content: intro,
success: res => {
if (res.confirm) {
uni.showLoading({
title: '正在更新',
mask: true
});
uni.downloadFile({
url: appurl,
success: download => {
if (download.statusCode == 200) {
plus.runtime.install(
download.tempFilePath,
{
force: false
},
() => {
uni.hideLoading();
plus.runtime.restart(); //更新成功启动
},
err => {
//若没下载成功还是去下载
uni.hideLoading();
uni.showToast({
title: '更新失败,将跳转下载页面',
icon: 'none',
duration: 2000
});
}
);
setTimeout(function() {
plus.runtime.openURL(appurl);
}, 2000);
}
}
});
} else if (res.cancel) {
console.log('用户点击取消');
uni.showToast({
title: '版本无法继续使用瑞金田长APP,请先升级',
icon: 'none',
duration: 2000
});
//退出app
setTimeout(function() {
plus.runtime.quit();
}, 2000);
}
},
fail: () => {
uni.hideLoading();
}
});
} else {
}
}
}
});
} else {
//非安卓
}
});
}
二、后台提供接口(方案二) APP升级或热更新
1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})
2、通过接口获取更新内容
3、如果用户版本号小于升级包版本号,先升级。
4、如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新
<script>
export default {
onLaunch: function() {
console.log('App Launch');
},
onLoad() {
},
onShow: function() {
// #ifdef APP-PLUS //只有App才会执行 检查更新 方法
uni.getSystemInfo({
success: (res) => {
var that = this;
//检测当前平台,如果是安卓则启动安卓更新
if (res.platform == "android") {
that.checkUpdateApp();
}
}
})
// #endif
},
onHide: function() {
},
methods:{
/* 检查更新 在线更新 */
checkUpdateApp(){
// 获取manifest.json里的配置信息
plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
// 可以根据manifest.json里的应用名称来进行针对性的APP升级
if (widgetinfo.name == "xxxx") { //APP名称
// 获取manifest.json里的版本号
uni.request({
url:'',//服务器请求更新信息地址
success:(srcData) => {
console.log(srcData)
let data = srcData.data;
let version = widgetinfo.version,//用户当前版本
appVersion = data.apk_client_version,//升级包版本
appName = widgetinfo.name, //app名称
updata = data.apk_client_force_updata,//是否强制热更新
appurl = data.apk_client_download,//升级包地址
intro = data.apk_client_intro,//升级包提示
wgt_version = data.wgt_version,//热更新版本号
wgt_download = data.wgt_download;//热更新地址
//如果用户版本号小于升级包版本号,先升级
if(data && (version < appVersion)){
uni.showModal({
title:"更新提示",
confirmText:"立即升级",
content:intro,
success: (src) => {
if (res.confirm) {
uni.showLoading({
title:"正在更新",
mask:true
})
uni.downloadFile({
url:appurl,
success: (download) => {
if(download.statusCode == 200){
plus.runtime.install(download.tempFilePath,{
force:false
},()=>{
uni.hideLoading();
plus.runtime.restart();//更新成功启动
},(err)=>{//若没下载成功还是去下载
uni.hideLoading();
uni.showToast({
title:"更新失败,将跳转下载页面",
icon:"none",
duration:2000
})
})
setTimeout(function(){
plus.runtime.openURL(appurl);
},2000)
}
}
})
} else if (res.cancel) {
console.log('用户点击取消');
uni.showToast({
title:"版本无法继续使用瑞金田长APP,请先升级",
icon:"none",
duration:2000
})
//退出app
setTimeout(function(){
plus.runtime.quit();
},2000)
}
},
fail: () => {
uni.hideLoading();
}
})
}else{
}
//如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新
if(data && (version >= appVersion) && (version != wgt_version)){
uni.showLoading({
title:"正在更新包,请稍后...",
mask:true
})
uni.downloadFile({
url:wgt_download,
success: (wgtdow) => {
if(wgtdow.statusCode == 200){
plus.runtime.install(wgtdow.tempFilePath,{
force:true
},()=>{
uni.hideLoading();
plus.runtime.restart();//更新成功启动
},(err)=>{//若没下载成功还是去下载
uni.hideLoading();
uni.showModal({
content:"更新失败,请手动下载最新瑞金田长APP",
success: (res) => {
plus.runtime.openURL(wgt_download);
}
})
})
}
}
})
}
}
})
} else {
//非安卓
}
});
}
},
};
</script>