百度上搜到很多uniapp自动更新的写法,但是测试之后基本上都是可以检查版本号,下载更新包,然后无法唤起自动更新的安装程序,最后找到解决的办法记录一下。
打包过程还是一样,但是需要修改一些配置,如果忘记怎么打包可以参考 HBuilderX项目打包安卓操作记录
1、Android Studio中build.gradle(:app)的targetSdkVersion 改为26以上
2、确保HBuilderX中的权限是否有完整添加
3、将2中添加的权限添加到Android Studio的Androidmanifest.xml 中
自动更新代码
//检查平台类型,在需要做更新检查的地方可以调用CheckPlatForm
function CheckPlatForm() {
uni.getSystemInfo({
success: (res) => {
//检测当前平台,如果是安卓则启动安卓更新
if (res.platform == "android") {
this.AndroidCheckUpdate();
}
}
})
}
AndroidCheckUpdate: function() {
var that = this;
//uni.removeStorageSync("lastCheckUpdate") //test
var lastCheckUpdate = uni.getStorageSync("lastCheckUpdate"); //上次检查日期
var tipTimeLength = 3600; //提示间隔1小时
var curTime = new Date().getTime(); //当前日期
//如果近期有提示过,则不需要再提示
if (lastCheckUpdate != '' && lastCheckUpdate != undefined) {
if (lastCheckUpdate + tipTimeLength <= curTime)
return
}
//请求获取最新版本号
that.tui.request(that.$global.ApiUrl.CheckVersion, "get")
.then((data) => {
if (data.success) {
var downLoadUrl = data.data.downloadUrl;
var updType = data.data.updType;
var force = data.data.force;
var serverVersion = data.data.code;
plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) {
var curVersion = wgtinfo.version
if (data.data.code == curVersion) {
return;
}
if (force) {
that.GetInstallFile(downLoadUrl, updType, force)
} else {
uni.showModal({
title: "版本更新",
content: "当前版本:" + curVersion + "\r\n服务器版本:" + data.data
.code + "\r\n\r\n是否开始更新?",
showCancel: !force,
confirmText: "立即更新",
cancelText: "稍后提醒",
success: function(res) {
if (res.confirm) {
that.GetInstallFile(downLoadUrl, updType, force)
} else {
//记录最后更新时间
uni.setStorageSync("lastCheckUpdate",
new Date().getTime());
}
}
})
}
});
} else {
that.tui.toast("无法获取最新版本号")
}
})
.catch((res) => {
})
}
GetInstallFile:function(url, updType, force){
var that = this
var list = url.split('/');
var fileName = list[list.length - 1];
var filePath = "_downloads/"+fileName
plus.io.resolveLocalFileSystemURL(filePath,
function(res){
that.installApp(filePath)
},function(res){
that.StarDownLoad(url,updType,force)
})
}
//下载最新版本
StarDownLoad: function(url, updType, force) {
var that = this
if (url == undefined || url == "") {
that.tui.toast("下载失败,下载路径不存在!")
return
}
uni.showLoading({
mask: true,
title: "下载更新中"
})
var dtask = plus.downloader.createDownload(url, {},
function(d, status) {
// 下载完成
if (status == 200) {
that.installApp(d.filename)
} else {
that.UpdFail(force)
}
});
dtask.start();
}
//安装新APP
installApp:function(filePath){
uni.hideLoading()
uni.showLoading({
mask: true,
title: "安装中"
})
filePath=plus.io.convertLocalFileSystemURL(filePath)
plus.runtime.install(filePath, {},
function(res) {
uni.hideLoading()
uni.showToast({
title: "安装成功",
showCancel: false,
success: function() {
plus.runtime.restart()
}
})
},
function(error) {
that.UpdFail(force)
})
}
//更新失败提示
UpdFail: function(force) {
uni.hideLoading()
uni.showToast({
title: '更新失败',
icon: error,
mask: false,
duration: 1500,
showCancel: false,
success: function(res) {
//如果要求强制更新,然而更新失败则退出app
if (force) {
plus.runtime.quit();
}
}
});
}