uniapp APP检测更新

news2025/1/10 23:33:00

需求:

1.首次进入APP给出弹窗提示是否存在最新版本APP,可选择更新或者取消

2.选择取消后,在使用期间不再弹出该弹窗

3.在设置中增加按钮,点击进行版本检测,再弹窗

效果图:

使用到的插件:APP升级,在线升级支持android、ios - DCloud 插件市场

二次开发效果好,可根据项目需求自行修改页面结构,静态图片

场景1:进入APP自动检测实现
1.App.vue中

export default {
	globalData: {
		autocheckupdate: false //是否开启自动检测
	},
onLaunch() {
	// #ifdef APP
	this.autocheckupdate = true //开启检测
	uni.setStorageSync('autocheckupdate',this.autocheckupdate) //存入缓存
	setTimeout(()=>{
		this.autocheckupdate = false
		uni.setStorageSync('autocheckupdate',this.autocheckupdate)
	},2500) //这里我写的简单,2.5s后自动设置为不开启,可以根据项目需求来写
	// #endif

2.首页xxx.vue中

import ZyUpdate from '../../components/zy-upgrade/zy-upgrade.vue'
components: {
    ZyUpdate
  },
data() {
    return {
      autocheckupdate: uni.getStorageSync('autocheckupdate'),
      updateurl: '', //后端检测版本接口地址
      oldversion: '' //当前项目版本号
    };
  },
<!-- #ifdef APP-PLUS -->
    <zy-update 
      ref="zyupgrade" 
      :updateurl="updateurl"
      :autocheckupdate="autocheckupdate"
      :noticeflag="true" 
      :h5preview="true" 
      :oldversion="oldversion" 
      @showupdateTips="showupdatetips">
    </zy-update>
    <!-- #endif -->
onLoad() {
    // #ifdef APP-PLUS
    plus.runtime.getProperty(plus.runtime.appid,(widgetInfo) => { 
			this.oldversion = widgetInfo.version //检测app版本
		});  
    this.updateurl = 'xxx' //后端检测更新接口地址
    // #endif
  },
showupdatetips(flag){
        if(flag == 0){
            uni.showToast({
                title: '已经是最新版本了',
                icon:'none'
            });
        }
    },

3.zy-upgrade.vue文件中,样式结构自己根据UI图修改,静态资源图片可以自行修改, 另外不要照抄appVersion这个接口,这是我自己封装的,copy没用,记得自己封装自己的接口,替换就好

<template>
	<view class="zy-modal" :class="dshow?'show':''">
		<view class="zy-dialog" style="background-color: transparent;">
			<view class="padding-top text-white" :class="'zy-upgrade-topbg-'+theme">
				<view>
					<text class="zy-upgrade-title">
						发现新版本
					</text>
				</view>
				<text class="flex-wrap">{{version}}</text>
			</view>
			<view class="padding-xl bg-white text-left">
				<scroll-view style="max-height: 200rpx;" scroll-y="auto" v-if="!update_flag">
					<text>{{update_tips}}</text>
				</scroll-view>
				<view class="zy-progress radius striped active" v-if="update_flag">
					<view :class="'bg-'+theme" :style="'width: '+update_process+'%;'">
						{{update_process}}
					</view>
				</view>
			</view>
			<view class="zy-bar bg-white justify-end">
				<view class="action" v-if="!update_flag">
					<button class="zy-btn" :class="'bg-'+theme" @click="upgrade_checked">确认升级</button>
					<button class="zy-btn margin-left" :class="'line-'+theme"
					v-if="!forceupgrade"
					 @click="upgrade_cancel">取消升级</button>
				</view>
				<view class="action text-center" v-if="update_flag&&!forceupgrade">
					<button class="zy-btn" :class="'bg-'+theme" @click="upgrade_break">中断升级</button>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	import { appVersion } from '../../api/index.js' //这是封装的接口,记得修改成自己的
	export default {
		name: 'ZyUpgrade',
		props: {
			theme: {	//主题,目前支持green,pink,blue,yellow,red
				type: String,
				default: 'green'
			},
			updateurl: {	//升级检测url,全路径
				type:String,
				default: ''
			},
			h5preview:{	//H5界面下是否预览升级
				type: Boolean,
				default: false
			},
			oldversion: {	//如果是H5,为了方便测试,可以传入一个旧版本号进来。
				type: String,
				default: ''
			},
			oldcode: { //如果是H5,为了方便测试,可以传一个旧版本的code进来。
				type: Number,
				default: 0
			},
			appstoreflag: {	//是否启用appstore升级,如果启用,由服务端返回appstore的地址
				type: Boolean,
				default: true
			},
			noticeflag:{	//是否通知主界面无需更新
				type:Boolean,
				default: false
			},
			autocheckupdate:{	//是否页面截入时就判断升级
				type:Boolean,
				default: false
			}
		},
		data() {
			return {
				update_flag: false, //点击升级按钮后,显示进度条
				dshow: false,
				update_process: 0,
				downloadTask: [],
				updated2version: '',
				version_url: '',
				update_tips: '',
				forceupgrade: false,
				currentversion: this.oldversion,
				versionname: '',
				vesioncode: this.oldcode,
				wgt_flag: 0,
				wgt_url: '',
				size: 0 ,//开启gzip等情形下,获取不到安装包大小,可以服务端返回安装包大小
			}
		},
		mounted() {
			let app_flag = false
			// #ifdef APP-PLUS
			app_flag = true
			// #endif
			if((this.h5preview || app_flag) && this.autocheckupdate){
				console.log("检测升级")
				this.check_update()
			}
		},
		computed:{
			version(){
				let retversion = ''
				retversion = this.currentversion + (this.currentversion!=''&&this.updated2version!=''?'->':'')+this.updated2version
				return retversion
			}
		},
		methods:{
			//检测升级
			check_update(){
				console.log('执行检测升级');
				let that = this
				// #ifdef APP-PLUS
				plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { 
					that.currentversion = widgetInfo.version
					that.versionname = widgetInfo.name
					that.versioncode = widgetInfo.versionCode
					console.log('that.currentversion',that.currentversion);
					console.log('that.versionname',that.versionname);
					console.log('that.versioncode',that.versioncode);
					that.updatebusiness(that)
				});  
				// #endif
				// #ifdef H5
				if(this.h5preview){
					this.updatebusiness(that)
				}
				// #endif
				
			},
			async updatebusiness(that){ //具体升级的业务逻辑
				// uni.showLoading({
				// 	title: '',
				// 	mask: false
				// });
				let platform = uni.getSystemInfoSync().platform
				let formdata = {
					version: that.currentversion,  
					platform: platform == 'android' ? 2 : 1
				}
				console.log('开始请求接口判断是否升级',formdata);
				try{
					let data = await appVersion(formdata) //该接口仅做实例展示,记得改成自己封装的接口
					console.log('调取成功返回的数据',data);
					uni.hideLoading()
					if(data.code == 0){
						console.log(data)
							//提示升级
						if(data.data.update_flag == 1){
							that.dshow = true
							console.log('需要升级');
							that.update_tips = data.data.update_tips
							that.forceupgrade = data.data.forceupdate==1
							that.version_url = data.data.update_url
							console.log('that.version_url',that.version_url);
							//that.currentversion = widgetInfo.version
							that.updated2version = data.data.version
							that.wgt_flag = data.data.wgt_flag
							that.wgt_url = data.data.wgt_url
							that.size = data.data.size
						}else{
							if(that.noticeflag){
								//通知父组件,当前版为最新版本
								that.$emit("showupdateTips",0)
							}
						}
					}else{
						uni.showToast({
							title: '请求升级出错:'+data.msg,
							icon:'none'
						});
					}
				}catch(err){
					uni.hideLoading()
					console.log('检查升级接口失败原因',err);
				}
				// uni.request({  
				// 	url: that.updateurl,
				// 	method: 'POST',  
				// 	data: formdata,
				// 	success: (result) => {
				// 		console.log('调取成功返回的数据',result);
				// 		uni.hideLoading()
				// 		let data = result.data
				// 		if(data.code == 100){
				// 			console.log(data)
				// 				//提示升级
				// 			if(data.data.update_flag == 1){
				// 				that.dshow = true
				// 				that.update_tips = data.data.update_tips
				// 				that.forceupgrade = data.data.forceupdate==1
				// 				that.version_url = data.data.update_url
				// 				//that.currentversion = widgetInfo.version
				// 				that.updated2version = data.data.version
				// 				that.wgt_flag = data.data.wgt_flag
				// 				that.wgt_url = data.data.wgt_url
				// 				that.size = data.data.size
				// 			}else{
				// 				if(that.noticeflag){
				// 					//通知父组件,当前版为最新版本
				// 					that.$emit("showupdateTips",0)
				// 				}
				// 			}
				// 		}else{
				// 			uni.showToast({
				// 				title: '请求升级出错:'+data.msg,
				// 				icon:'none'
				// 			});
				// 		}
				// 	},
				// 	fail: (err) => {
				// 		console.log('检查升级接口失败原因',err);
				// 	}  
				// });  
			},
			//点击开始升级按钮,开始升级
			upgrade_checked:function(){
				this.update_flag = true
				this.updateversion()
			},
			//点击取消升级按钮,取消升级
			upgrade_cancel:function(){
				this.dshow = false
			},
			//升级过程中,点击中断升级按钮,中断升级
			upgrade_break: function(){
				console.log('执行中断');
				this.dshow = false
				this.update_flag = false
				this.downloadTask.abort()
			},
			//升级下载apk安装包的具体处理业务逻辑
			updateversion: function(){
				let platform = uni.getSystemInfoSync().platform
				let that = this
				console.log("操作系统:",platform)
				if(platform == 'ios' && this.appstoreflag){
					//如果启用ios appstore升级,则打开appstore
					that.dshow = false
					console.log("跳转至appstore")
					plus.runtime.launchApplication({
					    action: that.version_url
					}, function(e) {
					    uni.showToast({
					    	title: '打开appstore失败',
							icon:'none'
					    });
					});
				}else{
					let that = this
					let downloadurl = that.wgt_flag==1?that.wgt_url:that.version_url
					this.update_confirm = true
					this.downloadTask = uni.downloadFile({
						url: downloadurl,
						success:function(res){
							if(res.statusCode == 200){
								//开始安装
								plus.runtime.install(res.tempFilePath, {
									force: false  
								}, function() {  
									console.log('install success...');
									plus.runtime.restart();
								}, function(e) {  
									console.error('install fail...',e);  
									uni.showToast({
										title: '升级失败',
										icon:'none'
									});
								});  
							}else{
								uni.showToast({
									title: '下载失败,网络错误',
									icon:'none'
								});
							}
						},
						fail:function(e) {
							console.log("下载失败",e)
							uni.showToast({
								title: '下载失败:'+e.errMsg,
								icon:'none'
							});
							this.update_flag = false
						},
						complete:function(){
						}
					})
					this.downloadTask.onProgressUpdate(function(res){
						that.update_process = res.progress
						if(res.progress == Infinity){
							//使用size计算
							console.log("计算size");
							let progress = (res.totalBytesWritten / that.size)*100
							if(progress>100){
								progress = 100
							}
							that.update_process = progress
						}
					})
				}
			},
		}
	}
</script>

<style scoped>
	@import url("./static/css/main.css");
	.zy-upgrade-topbg-green {
		background-image: url('./static/images/green.png');
		background-size: 100% 100%;
		background-repeat: no-repeat;
		height: 290rpx;
	}
	.zy-upgrade-topbg-red {
		background-image: url('./static/images/red.png');
		background-size: 100% 100%;
		background-repeat: no-repeat;
		height: 290rpx;
	}
	.zy-upgrade-topbg-pink {
		background-image: url('./static/images/pink.png');
		background-size: 100% 100%;
		background-repeat: no-repeat;
		height: 290rpx;
	}
	.zy-upgrade-topbg-yellow {
		background-image: url('./static/images/yellow.png');
		background-size: 100% 100%;
		background-repeat: no-repeat;
		height: 290rpx;
	}
	.zy-upgrade-topbg-blue {
		background-image: url('./static/images/blue.png');
		background-size: 100% 100%;
		background-repeat: no-repeat;
		height: 290rpx;
	}
	.zy-upgrade-title {
		font-size: 50rpx;
		color: white;
	}
</style>

场景2:手动点击按钮检测是否更新

这里就不需要像场景1一样用到autocheckupdate参数来开启检测,只需要在@click点击事件里调方法 this.$refs.zyupgrade.check_update()

<!-- #ifdef APP-PLUS -->
    <zy-update 
      ref="zyupgrade" 
      :updateurl="updateurl"
      :autocheckupdate="false"
      :noticeflag="true" 
      :h5preview="true" 
      :oldversion="oldversion" 
      @showupdateTips="showupdatetips">
    </zy-update>
    <!-- #endif -->
<view class="info_item" @click="checkVersion" style="border-bottom: 1rpx #E6E6E6 solid;">
        <text>版本号</text>
        <view class="version">
          <text class="tititi">{{oldversion}}</text>
          <image
            class="tototo"
            src="https://xxx/my_back.png"
          ></image>
        </view>
      </view>
checkVersion(){
      console.log('检查版本');
      this.$refs.zyupgrade.check_update()
    },

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解自然语言处理中的位置编码(Positional Encoding)

在自然语言处理和特别是在使用Transformer模型中,位置编码(Positional Encoding)是一个关键的概念。它们的作用是为模型提供序列中各个元素的位置信息。由于Transformer架构本身并不像循环神经网络(RNN)那样具有处理序列的固有能力,位置编码因此显得尤为重要。 为什么需…

大语言模型微调过程中的 RLHF 和 RLAIF 有什么区别?

目前想要深入挖掘大型语言模型&#xff08;LLM&#xff09;的全部潜力需要模型与我们人类的目标和偏好保持一致。从而出现了两种方法&#xff1a;来自人类反馈的人力强化学习&#xff08;RLHF&#xff09;和来自人工智能反馈的人工智能驱动的强化学习&#xff08;RLAIF&#xf…

linux磁盘管理和挂载和镜像源管理

一.分清文件类型 所有的设备都在/dev中 我们知道d开头是目录 c开头是外部设备比如打印机&#xff0c;鼠标等外接设备 b开头才是我们要找的块文件&#xff0c;即硬盘 二. 3个磁盘管理 1.mount负责挂载外部磁盘2.fdisk查看磁盘分区情况3.lsblk查看可用设备信息以及它们的挂载点…

Android Studio Iguana | 2023.2.1配置优化

一. 前言 本篇文章记录最新版本的Android Studio的配置优化&#xff0c;写这篇文章的是由于电脑中的AS工具更新版本覆盖安装后&#xff0c;AS会经常卡死&#xff0c;Debug的时候也经常莫名其妙的断掉&#xff0c;非常影响工作效率&#xff0c;所以重新把配置环境整理一下&#…

模型部署的艺术:让深度学习模型跃入生产现实

模型部署的艺术&#xff1a;让深度学习模型跃入生产现实 1 引言 1.1 部署的意义&#xff1a;为何部署是项目成功的关键 在深度学习项目的生命周期中&#xff0c;模型的部署是其成败的关键之一。通常&#xff0c;一个模型从概念构思、数据收集、训练到优化&#xff0c;最终目的…

Python网络爬虫-详解XPath匹配网页数据

前言 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言。XPath使用路径表达式来选取XML文档中的节点或节点集。这些节点是通过沿着路径&#xff08;path&#xff09;或者步&#xff08;steps&#xff09;来选取…

grafana报错This panel requires Angular (deprecated)

1.原因 报错解释&#xff1a; Grafana在更新到7.0版本后&#xff0c;弃用了AngularJS&#xff08;一种用于构建大型Web应用的JavaScript框架&#xff09;。在早期的Grafana版本中&#xff0c;某些面板可能依赖于AngularJS&#xff0c;但这种依赖已经逐步被新的React或Vue面板所…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们&#xff0c;大家好&#xff01;我们的ODC&#xff08;OceanBase Developer Center &#xff09;再次迎来了重要的升级V 4.2.4&#xff0c;这次我们诚意满满&#xff0c;从五个方面为大家精心打造了一个更加易用、贴心&#xff0c;且功能更强的新版本&#xff0c;相…

网动统一通信平台(Active UC) downloadDocument.action 任意文件读取漏洞复现

0x01 产品简介 网动统一通信平台(Active UC) 是一个涵盖了多种通信功能的综合平台&#xff0c;通常包括文字、语音、视频通讯等功能&#xff0c;并且可能提供了一系列的通讯工具和服务。这样的平台通常旨在提升用户的沟通效率和便利性&#xff0c;为用户提供一个统一的通信环境…

探索未来的区块链DApp应用,畅享数字世界的无限可能

随着区块链技术的飞速发展&#xff0c;分布式应用&#xff08;DApp&#xff09;正成为数字经济中的一股强劲力量。DApp以其去中心化、透明公正的特点&#xff0c;为用户带来了全新的数字体验&#xff0c;开创了数字经济的新潮流。作为一家专业的区块链DApp应用开发公司&#xf…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

贪吃蛇(C语言版)

在我们学习完C语言 和单链表知识点后 我们开始写个贪吃蛇的代码 目标&#xff1a;使用C语言在Windows环境的控制台模拟实现经典小游戏贪吃蛇 贪吃蛇代码实现的基本功能&#xff1a; 地图的绘制 蛇、食物的创建 蛇的状态&#xff08;正常 撞墙 撞到自己 正常退出&#xf…

IDEA pom.xml依赖警告

IDEA中&#xff0c;有时 pom.xml 中会出现如下提示&#xff1a; IDEA 2022.1 升级了检测易受攻击的 Maven 和 Gradle 依赖项&#xff0c;并建议修正&#xff0c;通过插件 Package Checker 捆绑到 IDE 中。 这并不是引用错误&#xff0c;不用担心。如果实在强迫症不想看到这个提…

pycharm远程连接server

1.工具–部署–配置 2.部署完成后&#xff0c;将现有的项目的解释器设置为ssh 解释器。实现在远端开发 解释器可以使用/usr/bin/python3

C#-使用Harmony库实现DLL文件反射调用

一. Harmony工作原理 利用C#运行时Runtime的反射机制,动态加载dll中的方法,字段,属性,实现对DLL方法的重写和代码注入。 二. Harmony下载及安装 1.下载Harmony_lib库lib.harmony.2.3.3.nupkg 霸王•吕布 / CSharpHarmonyLib GitCodehttps://gitcode.net/qq_35829452/csharph…

万界星空科技电机行业MES+商业电机行业开源MES+项目合作

要得出mes系统解决方案在机电行业的应用范围&#xff0c;我们先来看一下传统机电行业的管理难题&#xff1a; 1、 产品标准化程度较低&#xff0c;制造工艺复杂&#xff0c;生产周期较长&#xff0c;产品质量不稳定&#xff1b; 2、 自动化程度低&#xff0c;大多数工序以手工…

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)

一、配置Java环境变量 打开CMD输入java -version检查java环境变量是否配置正确,如果配置正确在CMD窗口输入java -version应该输出如下: ​ 怎么配置Java环境变量这里我就不赘叙了,网上教程很多,请读者自行搜索操作。 二、下载Kafka 1、Kafka官网地址:Apache Kafka,…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …