uni-app檢測版本升級並顯示下載進度
一、檢測版本
1、自動檢測
即打開應用是就檢測應用版本,檢測方法需要寫在app.vue文件中,代碼如下
//APP更新
import configService from '@/common/service/config.service.js'
import store from '@/store'
console.log('configService', configService)
export default function appUpdate() {
console.log('=============000000', configService.apiUrl)
console.log('=============111111', uni.getStorageSync('base_url'))
uni.request({
url: configService.apiUrl +
'/qd/app/version/queryNewOne', // 'http://app.jeecg.com/update.json', //檢查更新的服務器地址
data: {
appid: plus.runtime.appid,
version: plus.runtime.version,
imei: plus.device.imei
},
header: {
'X-Access-Token': store.state.token
},
success: (data) => {
let res = data.data
console.log('----------app res--' + JSON.stringify(res))
//return;
plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) {
let client_version = wgtinfo.version
console.log('client_version')
console.log(client_version.split(".").splice(0, 2).join(""))
console.log(res.result.versionCode.split(".").splice(0, 2).join(""))
console.log(client_version.split(".").splice(0, 2).join("") < res.result.versionCode
.split(".").splice(0, 2).join(""))
console.log(client_version.split(".").splice(0, 2).join("") == res.result
.versionCode.split(".").splice(0, 2).join(""))
var flag_update = client_version.split(".").splice(0, 2).join("") < res.result
.versionCode.split(".").splice(0, 2).join("")
var ifEqual = client_version.split(".").splice(0, 2).join("") == res.result
.versionCode.split(".").splice(0, 2).join("")
var flag_hot = (Number(client_version.split(".")[2]) < Number(res.result.versionCode
.split(".")[2])) && !flag_update
console.log(client_version)
console.log(flag_update)
console.log(flag_hot)
if (flag_update) {
// 提醒用戶更新
uni.showModal({
title: '更新提示',
content: res.result.content || `更新新版本${res.result.versionCode}`,
success: (showResult) => {
if (showResult.confirm) {
plus.nativeUI.toast("正在准備環境,請稍后!");
console.log(res.result.androidUpdateUrl, )
var dtask = plus.downloader.createDownload(res.result
.androidUpdateUrl, {
method: 'GET',
filename: '_doc/update/'
},
function(d, status) {
if (status == 200) {
var path = d.filename; //下載apk
plus.runtime.install(path); // 自動安裝apk文件
} else {
plus.nativeUI.alert('版本更新失敗:' + status);
}
});
try {
dtask.start(); // 開啟下載的任務
var prg = 0;
var showLoading = plus.nativeUI.showWaiting(
"正在下載"); //創建一個showWaiting對象
dtask.addEventListener('statechanged', function(
task,
status
) {
// 給下載任務設置一個監聽 並根據狀態 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下載");
break;
case 2:
showLoading.setTitle("已連接到服務器");
break;
case 3:
prg = parseInt(
(parseFloat(task
.downloadedSize
) /
parseFloat(task
.totalSize)) *
100
);
showLoading.setTitle(" 正在下載" +
prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下載完成
break;
}
});
} catch (err) {
plus.nativeUI.closeWaiting();
uni.showToast({
title: '更新失敗-03',
mask: false,
duration: 1500
});
}
}
}
})
store.commit('SET_IFLASTVER', false)
} else if (ifEqual && flag_hot) {
uni.downloadFile({
url: res.result.hotUpdateUrl,
success: (downloadResult) => {
console.log(downloadResult.tempFilePath)
if (downloadResult.statusCode === 200) {
plus.nativeUI.toast(`正在熱更新!${res.result.versionCode}`);
plus.runtime.install(downloadResult.tempFilePath, {
force: false
}, function() {
plus.nativeUI.toast("熱更新成功");
plus.runtime.restart();
}, function(e) {
console.log(e)
plus.nativeUI.toast(`熱更新失敗:${e.message}`);
});
}
}
});
store.commit('SET_IFLASTVER', false)
} else {
store.commit('SET_IFLASTVER', true)
}
});
console.log('-------------------------------res.result.androidUpdateUrl' + res.result
.androidUpdateUrl)
store.commit('SET_ANDROIDLINK', res.result.androidUpdateUrl)
store.commit('SET_IOSLINK', res.result.iosUpdateUrl)
}
})
}
2.在個人中心顯示應用版本,可以手動點擊校驗升級
在個人中心的vue文件中的created方法中寫入
二、升級
1、版本升級,上面js代碼中flag_update為true部分的代碼,簡略
2、熱更新
什么是熱更新
代碼中如何實現熱更新,此處簡略,詳細見上文js對應部分
我的設置解釋如下:版本設置1.3.0,對應的版本號為130
當后台返回過來的版本號大於應用的版本號時需要更新,舉個例子:應用版本為1.2.0時,后台返回過來的版本號為1.3.0則需要全更新;當應用版本為1.2.0時,后台返回過來的版本號為1.2.1則需要進行熱更新,熱更新不需要用戶確認才更新,可以理解為默默的自動更新
總結:就是當后台返回過來的版本號前兩位大於應用版本號前兩位時,則需要全更新;當后台返回過來的版本號前兩位等於應用版本號前兩位,但是后台的版本號最后一位大於應用版本號最后一位時,則需要熱更新
附上項目的版本號管理頁面
三、下載進度
代碼如下:
就是上面js文件中try-catch部分代碼,此處簡略
注意:在實現下載進度時,可能會遇到NAN的bug,此時是因為task.totalSize=0 ,作為分母時為零,所得到的值為非數值,此時就不能顯示對應的下載進度百分比
解決辦法:我這邊是后台返回了apk的大小,可以參考如下
下載進度代碼轉自:https://blog.csdn.net/weixin_36185028/article/details/103126680