1.设置一个检查更新的函数
const checkUpdate = async() => {
try{
// 通过接口获取到最新的版本信息(版本号/版本更新的内容)
const newVersion = await getNewVersion({……})
// 获取当前APP的版本(用Hbuilder打包的时候填写的版本号)
let version = plus.runtime.version
//一般会有版本忽略,我这边暂时存在前端的缓存里
if(userInfo.ignoreVersion.includes(version.value.new)){
console.log('这个版本忽略,不更新')
}else{
// 用【semver.js】进行版本的比较
const result = semver.compare(newVersion, version)
if(result > 0){
console.log('需要更新版本')
//打开版本更新的弹窗
updateShow.value = true
}
}
}catch(err:any){
console.log('checkUpdate',err)
}
}
这边就会有一个弹窗来给用户进行选择更新
如果用户选择了确定更新,就调用更新的函数
const comfirmUpdate = () => {
try {
console.log('更新')
// 在线包的地址
let url = '…………'
let options = {
method: 'stream',
timeout: 120000,
retry: true,
installSuccess: function (e: any) {
console.log('安装成功:' + e.filename)
},
installError: function (e: any) {
console.log('安装失败:' + e.message)
},
}
// @ts-ignore
let task = plus.downloader.createDownload(url, { filename: '_downloads/' }, function (download, status) {
if (status === 200) {
let localPath = download.filename
// @ts-ignore
plus.runtime.install(
localPath,
options,
function (localPath: any) {
console.log('应用已下载至本地路径:' + localPath)
},
function (err: any) {
console.log('错误信息:', err)
}
)
console.log('执行完成maybe')
} else {
console.log('下载失败')
}
})
task.addEventListener('statechanged', function (download: any, status: any) {
// 获取当前下载状态和进度信息
// let state = download.state
// let progress = (download.downloadedSize / download.totalSize) * 100
// console.log('下载状态:' + state + ',下载进度:' + progress + '%')
//进度条展示
progress.value = (Number(download.downloadedSize / download.totalSize).toFixed(2) as unknown as number) * 100
})
task.start()
} catch (err) {
console.log('comfirmUpdate', err)
}
}
这样子操作下来就没有问题啦~
备注:一般url会是直接的在线下载地址,例如http://……aa.doc或者.pdf,但是如果不是下载地址而是返回数据流的话,就需要配置请求头
//根据返回的数据流的文件格式设置
// 例如:apk:application/vnd.android.package-archive;xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
task.setRequestHeader('Content-Type', '……')
// 如果需要token,也要配置Authorization
task.setRequestHeader('Authorization', 'Bearer ' + userInfo.TOKEN)