uniapp APP检测更新

需求:

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

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

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

效果图:

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

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

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

export default {globalData: {autocheckupdate: false //是否开启自动检测},
onLaunch() {// #ifdef APPthis.autocheckupdate = true //开启检测uni.setStorageSync('autocheckupdate',this.autocheckupdate) //存入缓存setTimeout(()=>{this.autocheckupdate = falseuni.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-PLUSplus.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,redtype: 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-PLUSapp_flag = true// #endifif((this.h5preview || app_flag) && this.autocheckupdate){console.log("检测升级")this.check_update()}},computed:{version(){let retversion = ''retversion = this.currentversion + (this.currentversion!=''&&this.updated2version!=''?'->':'')+this.updated2versionreturn retversion}},methods:{//检测升级check_update(){console.log('执行检测升级');let that = this// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { that.currentversion = widgetInfo.versionthat.versionname = widgetInfo.namethat.versioncode = widgetInfo.versionCodeconsole.log('that.currentversion',that.currentversion);console.log('that.versionname',that.versionname);console.log('that.versioncode',that.versioncode);that.updatebusiness(that)});  // #endif// #ifdef H5if(this.h5preview){this.updatebusiness(that)}// #endif},async updatebusiness(that){ //具体升级的业务逻辑// uni.showLoading({// 	title: '',// 	mask: false// });let platform = uni.getSystemInfoSync().platformlet 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 = trueconsole.log('需要升级');that.update_tips = data.data.update_tipsthat.forceupgrade = data.data.forceupdate==1that.version_url = data.data.update_urlconsole.log('that.version_url',that.version_url);//that.currentversion = widgetInfo.versionthat.updated2version = data.data.versionthat.wgt_flag = data.data.wgt_flagthat.wgt_url = data.data.wgt_urlthat.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 = truethis.updateversion()},//点击取消升级按钮,取消升级upgrade_cancel:function(){this.dshow = false},//升级过程中,点击中断升级按钮,中断升级upgrade_break: function(){console.log('执行中断');this.dshow = falsethis.update_flag = falsethis.downloadTask.abort()},//升级下载apk安装包的具体处理业务逻辑updateversion: function(){let platform = uni.getSystemInfoSync().platformlet that = thisconsole.log("操作系统:",platform)if(platform == 'ios' && this.appstoreflag){//如果启用ios appstore升级,则打开appstorethat.dshow = falseconsole.log("跳转至appstore")plus.runtime.launchApplication({action: that.version_url}, function(e) {uni.showToast({title: '打开appstore失败',icon:'none'});});}else{let that = thislet downloadurl = that.wgt_flag==1?that.wgt_url:that.version_urlthis.update_confirm = truethis.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.progressif(res.progress == Infinity){//使用size计算console.log("计算size");let progress = (res.totalBytesWritten / that.size)*100if(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><imageclass="tototo"src="https://xxx/my_back.png"></image></view></view>
checkVersion(){console.log('检查版本');this.$refs.zyupgrade.check_update()},

完成

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

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

相关文章

消灭AI“耗电巨兽”?暴雨服务器推出液冷节能降耗算力方案

在科技飞速发展的今天&#xff0c;人工智能已成为驱动未来的重要力量。随着AI及大模型技术的进一步普及和应用场景的拓宽&#xff0c;相关算力需求呈指数级增长&#xff0c;大规模的AI训练和推理过程均需消耗大量电力&#xff0c;如同一个巨大的电力黑洞&#xff0c;吞噬着海量…

鸿蒙OpenHarmony【LED外设控制】 (基于Hi3861开发板)

概述 OpenHarmony WLAN模组基于Hi3861平台提供了丰富的外设操作能力&#xff0c;包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口&#xff0c;实现对GPIO控制&#xff0c;达到LED闪烁的效果。其他的IOT外设控制&#xff0…

【iOS开发】(五)react Native路由和导航20240421-22

【iOS开发】(五)react Native 路由和导航Navigation 20240421 在&#xff08;一&#xff09;&#xff08;二&#xff09;中我们 Reactnative搭建了开发环境、学习了 基础语法、状态管理&#xff0c;JSX、组件、状态和生命周期以及样式布局等。 在&#xff08;三&#xff09;&a…

【LeetCode】---118.杨辉三角

一、题目解析&#xff1a; 二、知识回顾&#xff1a; 1.二维数组&#xff1a; 2. C语言中的二维数组访问方式和vector二维数组的访问&#xff0c; 不同区别&#xff1a; &#xff08;1&#xff09;表面是一样的&#xff0c;但底层不同&#xff01; &#xff08;2&#xff09;静…

用户请求经过哪些处理(公网)

DNS服务器之间协作&#xff1a; 递归DNS查询&#xff1a;用户的请求首先发送到递归DNS服务器。 查询根DNS服务器&#xff1a;递归DNS服务器查询根DNS服务器&#xff0c;以找到管理.com顶级域的TLD DNS服务器。 查询TLD DNS服务器&#xff1a;根DNS服务器响应带有TLD DNS服务器…

人工智能时代的关键技术:深入探索向量数据库及其在AI中的应用

文章目录 1. 理解向量数据库&#xff1a;二维模型示例2. 向量数据库中的数据存储与检索3. 向量数据库如何工作&#xff1f;4. 向量数据库如何知道哪些向量相似&#xff1f; 在人工智能技术日益成熟的当下&#xff0c;向量数据库作为处理和检索高维数据的关键工具&#xff0c;对…

uniapp中vue写微信小程序的生命周期差别

根据uniapp官网里的生命周期&#xff0c;感觉不太对劲&#xff0c;就自己测试了几个&#xff0c;发现有所差别。 红字数字 为 实际测试生命周期顺序。 因为需要页面传参 后再 初始化数据&#xff0c;而onLoad(option)接收参数后&#xff0c;就已经过了create()了&#xff0c;所…

【目标检测】YOLOv7 网络结构(与 YOLOv4,YOLOv5 对比)

YOLOv7 和 YOLOv4 Neck 与 Head 结构对比 其实 YOLOv7 的网络结构网上很多文章已经讲得很清除了&#xff0c;网络结构图也有非常多的版本可供选择&#xff0c;因为 YOLOv7 和 YOLOv4 是一个团队的作品&#xff0c;所以在网络结构方面&#xff0c; YOLOv7 和 YOLOv4 有很多相似…

Amazon云计算AWS之[3]简单存储对象S3

文章目录 S3的基本概念和操作桶对象基本操作 S3的数据一致性模型基知&#xff1a;CAP理论S3的最终一致性 S3的安全措施身份认证&#xff08;Authentication&#xff09;访问控制列表&#xff08;ACL&#xff09;访问控制策略(ACP)授权用户类型 S3的基本概念和操作 简单存储服务…

【笔试强训】数字统计|两个数组的交集|点击消除

一、数字统计 链接&#xff1a;[NOIP2010]数字统计_牛客题霸_牛客网 (nowcoder.com) 思路&#xff1a; 枚举数字拆分&#xff08;模10 除10&#xff09; &#x1f4a1; 当前数据范围为10^4可以用int类型解决&#xff0c;如果到了10^9就需要用long类型 代码实现&#xff1a; i…

LayuiMini使用时候初始化模板修改(下载源码)

忘记加了 下载 地址 &#xff1a; layui-mini: layuimini&#xff0c;后台admin前端模板&#xff0c;基于 layui 编写的最简洁、易用的后台框架模板。只需提供一个接口就直接初始化整个框架&#xff0c;无需复杂操作。 LayuiMini使用时候初始化模板官网给的是&#xff1a; layu…

jvm知识点总结(一)

JVM的跨平台 java程序一次编写到处运行。java文件编译生成字节码&#xff0c;jvm将字节码翻译成不同平台的机器码。 JVM的语言无关性 JVM只是识别字节码&#xff0c;和语言是解耦的&#xff0c;很多语言只要编译成字节码&#xff0c;符合规范&#xff0c;就能在JVM里运行&am…

优化器与优化策略的搭配

在深度学习中不同的optimizer 通常会选择不同 优化策略 lr_sheduler 与之搭配&#xff1b; 1. SGD 与 Adam 优化器 Adam 与经典 SGD 的不同之处在于&#xff0c; Adam 执行局部参数更新&#xff08;即在参数级别进行更改&#xff09;&#xff0c;而不是全局执行此操作的 SGD…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制太阳黑子区域分布极坐标散点图

下面是一个示例&#xff0c;演示如何使用MATLAB绘制太阳黑子区域分布的极坐标散点图。在这个示例中&#xff0c;我们使用了数据集sunspotarea.csv的太阳黑子区域数据&#xff0c;来绘制极坐标散点图。 购书地址&#xff1a;https://item.jd.com/14102657.html

一不小心,创业5年了。。。

时间过得太快。2019年的春天&#xff0c;小灰毅然选择离开职场&#xff0c;选择了自媒体创业这条道路。时至今日&#xff0c;已经有整整5年了。 很多朋友问小灰&#xff0c;为什么要选择离开职场去创业呢&#xff1f;原因主要有两个&#xff1a; 第一&#xff0c;小灰是一个喜欢…

小程序 rich-text 解析富文本 图片过大时如何自适应?

在微信小程序中&#xff0c;用rich-text 解析后端返回的数据&#xff0c;当图片尺寸太大时&#xff0c;会溢出屏幕&#xff0c;导致横向出现滚动 查看富文本代码 图片是用 <img 标签&#xff0c;所以写个正则匹配一下图片标签&#xff0c;手动加上样式即可 // content 为后…

easyx库的学习(鼠标信息)

前言 本次博客是作为介绍easyx库的使用&#xff0c;最好是直接代码打到底&#xff0c;然后看效果即可 代码 int main() {initgraph(640, 480, EX_SHOWCONSOLE|EX_DBLCLKS);setbkcolor(RGB(231, 114, 227));cleardevice();//定义消息结构体ExMessage msg { 0 };//获取消息wh…

6.2 整合MongoDB

6.2 整合MongoDB 1. MongoDB简介2. MongoDB安装2.1 下载2.2 配置MongoDB2.3 MongoDB的启动和关闭1. 启动MongoDB2. 关闭MogoDB 2.4 安全管理 3. 整合SpringBoot3.1 依赖3.2 MongoTemplate使用3.3 测试1. 新增2. 查询3. 删除 *************************************************…

每天学习一个Linux命令之stat

每天学习一个Linux命令之stat 简介 在Linux系统中&#xff0c;stat命令用于显示文件的详细信息&#xff0c;包括文件的设备号、文件类型、权限、链接数、所有者、组、大小、时间戳等。stat命令是一个非常常用的命令&#xff0c;能够帮助我们了解文件的属性和状态。本篇博客将介…

uniapp 引用组件后 不起作用 无效果 不显示

根据uniapp官方文档easycom组件规范 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组件名称/组件名称.(vue|uvue)目录结构&#xff08;注意&#xff1a;当同时存在vue和uvue时&#xff0c;uni-app 项目优先使用 vue 文件&#xff0c;…