uni-app檢測版本升級並顯示下載進度


uni-app檢測版本升級並顯示下載進度

一、檢測版本

1、自動檢測

即打開應用是就檢測應用版本,檢測方法需要寫在app.vue文件中,代碼如下

image-20211215134920591

//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.在個人中心顯示應用版本,可以手動點擊校驗升級

image-20211215135614628

在個人中心的vue文件中的created方法中寫入

image-20211215135754397

image-20211215135851788

image-20211215135911310

二、升級

1、版本升級,上面js代碼中flag_update為true部分的代碼,簡略

image-20211215140758983

2、熱更新

什么是熱更新

代碼中如何實現熱更新,此處簡略,詳細見上文js對應部分

image-20211215141033757

我的設置解釋如下:版本設置1.3.0,對應的版本號為130

image-20211215141206300

當后台返回過來的版本號大於應用的版本號時需要更新,舉個例子:應用版本為1.2.0時,后台返回過來的版本號為1.3.0則需要全更新;當應用版本為1.2.0時,后台返回過來的版本號為1.2.1則需要進行熱更新,熱更新不需要用戶確認才更新,可以理解為默默的自動更新

總結:就是當后台返回過來的版本號前兩位大於應用版本號前兩位時,則需要全更新;當后台返回過來的版本號前兩位等於應用版本號前兩位,但是后台的版本號最后一位大於應用版本號最后一位時,則需要熱更新

附上項目的版本號管理頁面

image-20211215141900818

三、下載進度

代碼如下:

image-20211215140315299

就是上面js文件中try-catch部分代碼,此處簡略

注意:在實現下載進度時,可能會遇到NAN的bug,此時是因為task.totalSize=0 ,作為分母時為零,所得到的值為非數值,此時就不能顯示對應的下載進度百分比

解決辦法:我這邊是后台返回了apk的大小,可以參考如下

image-20211215142230878

下載進度代碼轉自:https://blog.csdn.net/weixin_36185028/article/details/103126680


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM