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的开发环境。数据库准备ÿ…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
