uniapp APP检测更新

需求:

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()
    },

完成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“三三裂变”,实体书营销实操细节分享……

“三三裂变”实操细节 一、实验结果 “三三裂变”的实验,结果比较好。就是我们大概有300人报名,但实际行动的只有109人,大概有103人都完成了三个人的目标,也就是说我们通过109人裂变了475人,利润率是1:4.5左右,整个裂变的效率还是可以的,也就是说: 如果你用这种方法有…

3节点ubuntu24.04服务器docker-compose方式部署高可用elk+kafka日志系统并接入nginx日志

一&#xff1a;系统版本: 二&#xff1a;部署环境&#xff1a; 节点名称 IP 部署组件及版本 配置文件路径 机器CPU 机器内存 机器存储 Log-001 10.10.100.1 zookeeper:3.4.13 kafka:2.8.1 elasticsearch:7.7.0 logstash:7.7.0 kibana:7.7.0 zookeeper:/data/zookeep…

微服务项目实战-黑马头条(八):App端-文章ES搜索、MongoDB搜索记录和关键词联想

文章目录 一、今日内容介绍1.1 App端搜索-效果图1.2 今日内容 二、搭建ElasticSearch环境2.1 拉取镜像2.2 创建容器2.3 配置中文分词器 ik2.4 使用postman测试 三、app端文章搜索3.1 需求分析3.2 思路分析3.3 创建索引和映射3.4 数据初始化到索引库3.4.1 导入es-init到heima-le…

JS -正则表达式

正则表达式 关于正则表达式&#xff0c;其实我写过几篇了&#xff0c;但是真正的正则表达式其实主要用于定义一些字符串的规则&#xff0c;计算机根据给出的正则表达式&#xff0c;来检查一个字符串是否符合规则。 我们来看一下&#xff0c;在JS中如何创建正则表达式对象。 语…

HTML:PC和手机的自适应图形布局样例

作者:私语茶馆 1.前言 有时我们需要开发一个自适应PC和手机的HTML页面,由于屏幕大小不同,会涉及到自动部署。W3School提供了一个非常好的案例:Responsive Image Gallery。本文利用独立CSS文件详细介绍一下这个案例。 2.案例详细介绍 2.1.Project项目文件结构 企业级项目…

电脑问题快速判断

电脑开机没有任何反应 检查电源 检查电源是否有问题或损坏&#xff0c;可以短接方法检测 板电源卡口对自己接第四或第五根线&#xff0c;若风扇匀速转动&#xff0c;电源无问题&#xff0c;若不转动或转一下停一下&#xff0c;电源有问题 检查内部连线 确保主板上的线插的…

Docker常用命令(镜像、容器、网络)

一、镜像 1.1 存出镜像 将镜像保存成为本地文件 格式&#xff1a;docker save -o 存储文件名 存储的镜像docker save -o nginx nginx:latest 1.2 载入镜像 将镜像文件导入到镜像库中 格式&#xff1a;docker load < 存出的文件或docker load -i 存出的文件…

蓝桥杯2024年第十五届省赛真题-小球反弹

以下两个解法感觉都靠谱&#xff0c;并且网上的题解每个人答案都不一样&#xff0c;目前无法判断哪个是正确答案。 方法一&#xff1a;模拟 代码参考博客 #include <iostream> #include <cmath> #include <vector>using namespace std;int main() {const i…

Axure实现tab页面切换功能

1. 实现效果 2. 实现原理 创建两个标签&#xff0c;并实现点击时选中状态点击时&#xff0c;设置面板状态 3. 实现步骤 3.1 实现可切换的标签 在页面上拖拽两个矩形作为两个tab标签&#xff0c;并命名 tab1 和 tab2 设置每个矩形的边框显示&#xff0c;只显示下边框即可 …

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…

WEB攻防-ASP中间件IIS文件上传解析安全漏洞

漏洞原理&#xff1a; 基于文件 IIS6.0默认不解析;号后面的内容&#xff0c;例如1.asp;.jpg会当成1.asp解析&#xff0c;相当于分号截断。 基于文件夹 IIS6.0会将/*.asp/文件夹下的文件当成asp解析。 案例&#xff1a; 写一个木马文件&#xff0c;并改为jpg后缀 GIF89agif8…

宁盾LDAP统一用户认证与单点登录:构建高效安全的企业身份认证

在信息化时代&#xff0c;企业面临着众多的应用系统和数据资源&#xff0c;如何有效地管理和保护这些资源&#xff0c;确保信息安全和高效利用&#xff0c;成为了企业信息化建设的核心问题。LDAP统一用户认证和单点登录&#xff08;SSO&#xff09;作为一种高效、安全的身份验证…

windows与linux搭建svn环境并自动更新代码

SVN搭建以及自动更新代码 目录 一、windows安装svn并且转成中文 第1步&#xff1a;先下载安装包如下下面是语言包与安装包 第2步&#xff1a;双击安装包一直点击下一步即可 第3步&#xff1a;双击安装中文语言包 第二步&#xff1a;勾选设置语言包 二、linux安装svn 第1步…

pycharm远程连接server

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

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

GDPU unity游戏开发 碰撞体与关节

让你设计的角色跑起来吧&#xff0c;可以是动画&#xff0c;也可以是碰撞器的运动。 运动小车 找到小车素材&#xff0c;导入到层级面板。然后可以新建一个地面让小车在上面运动&#xff0c;新建一个方块当障碍物。 摆放好后&#xff0c;要加组件。记住&#xff0c;在unity中运…

idea上传项目到gitee(码云)

1、打开码云&#xff0c;新建仓库 2、创建 3、这就是创建成功的页面 4、复制仓库地址&#xff0c;后面需要用到 2、打开我们的项目&#xff1a;例如我现在的项目 1、idea创建git仓库 2、选择我们项目文件夹的目录 3、查看文件是否变色&#xff0c;变色表示成功了 4、添加到缓…

unity cinemachine相机 (案例 跟随角色移动)

安装相机包 打开包管理工具 在 unity registry 搜索cinemachine 会在maincamera中生成一个组件cinemachineBrain 只能通过虚拟相机操控 主相机 虚拟相机的参数 案例 1.固定相机效果 位置 在固定的地方 默认的模式 2.相机跟随人物效果 焦距设置 20 跟随设置 把playere…

10.MMD 室内场景导入背景视频和灯光

导入背景视频 1. 导入人物和场景 场景是Akali’s room&#xff0c;可以在墙壁上添加视频 先添加主场景 2. 修改视频文件格式 在背景里选择导入背景视频文件 需要将mp4视频格式转化为AVI格式 方法一 先将视频导入格式工厂 点击配置 将视频编码改成DivX 再开始处理 …

【解决NodeJS项目无法在IDEA中调试的问题】使用JetBrains IDEA 2023 调试nodejs项目

项目采用Ant Design Pro React&#xff0c;使用前后端分离开发方式&#xff0c;后端可以很容易的打断点调试&#xff0c;但是前端通过网页进行调试&#xff0c;在IDEA中加了调试断点&#xff0c;但是没有什么用处。 解决方案如下&#xff1a; 点击新建运行配置 新建JavaScrip…