uni-app应用更新(Android端)
关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。
1.界面效果

界面中的弹框和 进度条采用了uView 提供的组件
2.检查更新并下载安装
一、版本信息配置在服务端,请求服务端接口判断是否需要更新 。
二、点击下载按钮,则开始下载App安装包,并监听下载进度,实时更新下载进度条
注意:下载App如果是在浏览器测试,可能会有跨域的问题,需要后端服务允许跨域。
三、待下载完成后开始安装。
安装App采用的是 uni-installApk插件,请自行导入项目
uni-installApk - DCloud 插件市场

3.完整代码
update.vue
<template><u-modal :show="show" :showConfirmButton="false"><view class="box-a4"><image class="img-up" mode="widthFix" src="https://beilizhengxuan.oss-cn-hangzhou.aliyuncs.com/huayu/update.png"/><view class="box-a5"><text>发现新版本V{{version}},升级后体验更顺畅</text></view><view class="row-b0" v-if="!startDownload"><view class="btn0" @click="downLoadApp" >马上更新</view><view class="btn0 white" color="" @click="cancel"v-if="forceUpdata=='0'">暂不更新</view></view><view v-if="startDownload" class="row-b1"><view class="te-j0">下载进度</view><u-line-progress :percentage="percent" height="24"activeColor="#3c9cff"></u-line-progress></view></view></u-modal>
</template>
<script>
import {getAppNewVersion} from '@/api/system/user'
export default{props:{},data(){return{startDownload: false, //是否开始下载show: false,version: '',forceUpdata: '',//是否需要强制更新apkDownloadUrl: '',//percent: 0,filePath: '',}},created(){this.handleToUpgrade()},computed:{showUpdate(){console.log('this.$stroe.state.user',this.$stroe.state.user)return this.$stroe.state.user.showUpdate}},methods:{async handleToUpgrade() {const sysInfo = uni.getSystemInfoSync()const appVersion = sysInfo.appVersionconsole.log('appVersion', appVersion)//请求服务端检查更新接口,判断是否需要更新const res = await getAppNewVersion()if(res.code == 200){if(res.data && res.data.newVersion){const newVersion = res.data.newVersionif(appVersion == newVersion){this.showToast('当前已是最新版本')this.cancel()} else{this.apkDownloadUrl = res.data.apkDownloadUrlthis.show = trueconsole.log('需要更新')this.version = newVersionthis.forceUpdata = res.data.forceUpdata}}}},installApp(){uni.installApk({filePath : this.filePath,success: (res)=>{console.log('安装成功--', res);},fail : (res)=>{console.log('安装失败--', res);},complete: (res)=>{console.log('安装完成--', res);}})},downLoadApp(){this.startDownload = trueconst downloadTask = uni.downloadFile({url: this.apkDownloadUrl , //仅为示例,并非真实的资源timeout: 6000000,success: (res) => {console.log('success res', res)if (res.statusCode === 200) {this.filePath = res.tempFilePathconsole.log('下载成功');this.cancel()this.installApp()}},complete: (res)=> {console.log('complete res', res)},fail: (res)=> {console.log('fail res', res)},});downloadTask.onProgressUpdate((res) => {//console.log('下载进度' + res.progress);//console.log('已经下载的数据长度' + res.totalBytesWritten);//console.log('预期需要下载的数据总长度' + res.totalBytesExpectedToWrite);this.percent = res.progressif (res.progress >= 100) {console.log('下载进度 abort' + res.progress);//downloadTask.abort();}});},cancel(){this.$emit('cancel')this.show = false},showToast(message){uni.showToast({title: message,icon: 'none'})}}
}
</script><style>.img-up{width: 100%;}.box-a4{width: 100%;display: flex;flex-direction: column;justify-content: flex-start;}.box-a5{flex:1;text-align: center;font-size: 28rpx;color: #999;padding: 20rpx 0;}.row-b0{display:flex;flex-direction: row;justify-content: space-around;align-items: center;padding: 0 50rpx;margin-top:60rpx;margin-bottom:60rpx;}.row-b0 .btn0{width: 240rpx;height: 68rpx;border-radius: 34rpx;color: white;display: grid;place-content: center;background:#3c9cff;}.row-b0 .btn0:active{opacity: 0.7;}.row-b0 .btn0.white{background:#fff;color: #666;border:1px solid #eee;}.row-b1{margin: 60rpx 40rpx;}.te-j0{text-align: center;color:#999;font-size: 26rpx;margin-bottom:20rpx;}
</style>
4.引入并使用
上面将检查更新的逻辑封装在了update.vue中,使用时只需引入该组件,在父页面点击检查更新按钮时,只需将 checkUpdate 属性设置为 true,则加载 update.vue组件,进入created 方法并调用检查更新的相关逻辑,有新版本则弹框,提示更新,无新版本则将 checkUpdate重置为 false
注意:当检查更新的弹框弹出时,调用页面需要禁用 android的 返回按键,在 onBackPress函数里面做相应的逻辑判断即可。
<template><view ><UpdateApp v-if="checkUpdate" @cancel="checkUpdate=false"/></view>
</template>
<script>
import UpdateApp from './update'export default {components:{UpdateApp},data() {return {checkUpdate: false,}},onBackPress(options) {console.log('onBackPress options', options)// 禁用返回if (options.from == 'backbutton') {console.log('--禁用返回')if(this.checkUpdate){return true;// 禁用返回按键}else {return false;}}},methods: {}}
</script>
<style lang="scss" scoped></style>
相关文章:
uni-app应用更新(Android端)
关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端,…...
JavaEE(2):前后端项目之间的交互
现在,在网页中通过超链接,表单就可以向后端发送请求,后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时,前端不能再进行其他操作 服务器端响应回来的内容,会把整个浏…...
(已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection
169期《YOLO-World Real-Time Open-Vocabulary Object Detection》 You Only Look Once (YOLO) 系列检测模型是目前最常用的检测模型之一。然而,它们通常是在预先定义好的目标类别上进行训练,很大程度上限制了它们在开放场景中的可用性。为了解决这一限制…...
Spring6梳理4——SpringIoC容器
以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 4.1 前言 4.2 IoC容器 4.2.1 控制反转(IoC) 4.2.2 依赖注入 4.2.3 IoC容器在Spri…...
SpringBoot2:请求处理原理分析-FORM表单请求接口
一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…...
Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
引言 在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR&…...
Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
在Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区(甚至到更细分的级别,如街道、小区等)的联动选择是一个常见的需求。Element Plus的Cascader组件非常适合这样的场景,因为它…...
使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)
目录 任务描述利用STK建模星地协同系统3个GEO高轨卫星240/20/1 Walker-Star Constellation 低轨卫星星座地面站或者地面设备 链路建模与数据提取处理星地链路星间链路数据读取的几种方法最麻烦的方法使用Matlab与STK互联接口使用大规模使用Chain 总结 任务描述 在一个星地协同…...
pytorch对不同的可调参数,分配不同的学习率
在 PyTorch 中,你可以通过为优化器传递不同的学习率来针对不同的可调参数分配不同的学习率。这通常通过向优化器传递一个字典列表来实现,其中每个字典指定特定参数组的学习率。下面是一个示例代码,展示了如何实现这一点: import …...
零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍
1. time模块 time():获取当前时间戳,是一个数字 localtime():返回一个time.struct_time对象,里面有年月日时分秒,还有星期几(0表示星期一)和今年的第几天 import timeprint(time.time()) pri…...
快速回顾-HTML5
HTML5-常用的标签:https://blog.csdn.net/TKOP_/article/details/111395865 <!-- HTML5:声明文档类型的标签 --> <!DOCTYPE html><!-- 用于声明网页的主要语言为简体中文 --> <!-- 帮助搜索引擎、浏览器等理解网页的语言内容,以便…...
视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势
随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。本文将探讨视频技术的未来发展趋势,并深入分析TSINGSEE青犀EasyCVR视频汇聚融合平台的技术优势,展现其…...
7个流行的开源数据治理工具
数字化时代,数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程,并为决策以及智能化服务提供支撑。大数据有大用途,但是也可能隐藏着巨大的风险,特别是如果我们对数据的情况不是很了解的时候&…...
js | XMLHttpRequest
是什么? 和serve交互数据的对象;能够达到页面部分刷新的效果,也就是获取数据之后,不会使得整个页面都刷新;虽然名字是XML,但不限于XML数据。 怎么用? function reqListener() {console.log(thi…...
2024国赛数学建模A题思路模型代码
2024国赛数学建模思路资料,思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模:两次校赛,两次国赛,两次美赛,一次电工杯。从大一下学期组队到现在,大三下学期,时间飞逝,我的…...
使用SVD(奇异值分解)进行降维的奇妙之旅
在数据分析和机器学习的广阔天地中,降维技术占据着举足轻重的地位。当我们面对高维数据时,不仅计算成本高昂,而且容易遭遇“维度灾难”,即随着维度的增加,数据的稀疏性和距离度量失效等问题愈发严重。为了克服这些挑战…...
【C++ 第二十一章】特殊类的设计(学习思路)
1.请设计一个类,不能被拷贝 设计思路 拷贝只会使用在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 的做法 将拷贝构造函数与赋值运算符…...
Java设计模式【命令模式】-行为型
1. 介绍 命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…...
【HarmonyOS】一键扫码功能
【HarmonyOS】一键扫码功能 前言 鸿蒙在api10之后,对系统api的基础上,封装了较为复杂功能的开发工具包,统一称之为Kit。这些Kit根据功能定义的不同,划分为不同的种类Kit。如下图所示: 其实可以理解为集成在系统中的…...
Spring Boot应用中集成与使用多数据源
Spring Boot应用中集成与使用多数据源 1. 前言 通过定义和使用多个数据源,能在Spring Boot应用中实现更复杂的数据管理场景,比如读写分离、数据冗余等。 2. 准备工作 环境准备:确保已经准备好Spring Boot的开发环境。数据库准备ÿ…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
