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.appVersion
			
			console.log('appVersion', appVersion)
            //请求服务端检查更新接口,判断是否需要更新
			const res = await getAppNewVersion()
	
			if(res.code == 200){
				if(res.data && res.data.newVersion){
					const newVersion = res.data.newVersion
					if(appVersion == newVersion){
						this.showToast('当前已是最新版本')
                        this.cancel()
					} else{
                        this.apkDownloadUrl = res.data.apkDownloadUrl
						this.show = true
						console.log('需要更新')
						this.version = newVersion
						this.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 = true
			const downloadTask = uni.downloadFile({
				url: this.apkDownloadUrl , //仅为示例,并非真实的资源
				timeout: 6000000,
				success: (res) => {
					console.log('success res', res)
					if (res.statusCode === 200) {
						this.filePath = res.tempFilePath
						console.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.progress
				if (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>

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

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

相关文章

时装爱好者的网页购物天堂:Spring Boot技术探索

第2章相关技术 2.1 B/S架构 B/S结构的特点也非常多&#xff0c;例如在很多浏览器中都可以做出信号请求。并且可以适当的减轻用户的工作量&#xff0c;通过对客户端安装或者是配置少量的运行软件就能够逐步减少用户的工作量&#xff0c;这些功能的操作主要是由服务器来进行控制的…

详解TensorRT的C++高性能部署以及C++部署Yolo实践

详解TensorRT的C高性能部署 一. ONNX1. ONNX的定位2. ONNX模型格式3. ONNX代码使用实例 二、TensorRT1 引言 三、C部署Yolo模型实例 一. ONNX 1. ONNX的定位 ONNX是一种中间文件格式&#xff0c;用于解决部署的硬件与不同的训练框架特定的模型格式的兼容性问题。 ONNX本身其…

JAVA数据导出为Excel

目录 一、导入依赖 二、使用的相关类 1、XSSFWorkbook 构造方法 创建表 操作表 保存表 样式和格式 日期处理 密码保护 其他 2、XSSFSheet 获取属性和信息 行操作 列操作 表的属性 合并单元格 保护表 页眉和页脚 注释 其它 3、XSSFRow 获取属性和信息 单…

单点登录OAuth2.0

OAuth 2.0&#xff08;Open Authorization 2.0&#xff09;是OAuth协议的第二个版本&#xff0c;于2012年正式成为RFC 6749标准。在OAuth 2.0之前&#xff0c;OAuth 1.0版本已经为Web应用提供了一定程度的授权功能&#xff0c;但随着时间的推移&#xff0c;这些版本逐渐显露出一…

Nginx: TCP建立连接的优化和启用Fast Open功能

TCP 建立连接优化 在三次握手中&#xff0c;相关TCP的内核参数可优化这一过程 net.ipv4.tcp_syn_retries 6net.ipv4.tcp_synack_retries 5net.ipv4.tcp_syncookies 0net.ipv4.tcp_max_syn_backlognet.core.somaxconnnet.core.netdev_max_backlog 1 &#xff09; net.ipv4…

C语言之猜数字小游戏

哈喽&#xff0c;大家好&#xff01;我是冰淇淋加点糖。今天我们来用前面所学的知识来开发一个猜数字的小游戏&#xff0c;锻炼我们的编程能力和编程思维。 猜数字小游戏功能简介 1.随机生成一个1-100的数字。 2.玩家用户开始猜数字。 > 猜大了&#xff0c;提醒猜大了…

【知识库系列】MPR/多模态方向观察:图像视频与3D生成

多模态背后的backbone会长成什么样&#xff1f; 各种模态到梯度下降到最后会不会都差不多&#xff1f; Sora 是不是已经被追上了? 我们真的把视频数据都用好了吗&#xff1f; 知识库完整文档&#xff1a; MPR/多模态方向观察&#xff1a;图像视频与3D生成&#xff1a;https…

SpringBoot实现前后端传输加密设计

在Web应用中&#xff0c;确保前后端之间的数据传输安全是非常重要的。这通常涉及到使用HTTPS协议、数据加密、令牌验证等安全措施。本文通过将前后端之间的传输数据进行加密&#xff0c;用于在Spring Boot应用中实现前后端传输加密设计。 一、数据加密方案 即使使用了HTTPS&…

java利用JXL操作excel

通过JXL操作Excel JXL是韩国人所著,目前停止更新,只支持xls格式,即2007之前的版本 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java…

c# checkbox的text文字放到右边

checkbox的text文字放到右边 实现方法如下图 特此记录 anlog 2024年9月2日

Tensorflow实现深度学习8:猫狗识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import matplotlib.pyplot as plt import tensorflow as tf # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] Fals…

带AI功能朵米客服系统3.5无限制开心版+搭建文档

带AI功能朵米客服系统3.5无限制开心版搭建文档&#xff0c;朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将…

万象奥科参展“2024 STM32全国巡回研讨会”—深圳站、广州站

9月3日-9月5日&#xff0c;万象奥科参展“2024 STM32全国巡回研讨会”— 深圳站、广州站。此次STM32研讨会将会走进全国11个城市&#xff0c;展示STM32在智能工业、无线连接、边缘人工智能、安全、图形用户界面等领域的产品解决方案及多样化应用实例&#xff0c;深入解读最新的…

【RabbitMQ之一:windows环境下安装RabbitMQ】

目录 一、下载并安装Erlang1、下载Erlang2、安装Erlang3、配置环境变量4、验证erlang是否安装成功 二、下载并安装RabbitMQ1、下载RabbitMQ2、安装RabbitMQ3、配置环境变量4、验证RabbitMQ是否安装成功5、启动RabbitMQ服务&#xff08;安装后服务默认自启动&#xff09; 三、安…

VR虚拟展厅的应用场景有哪些?

虚拟展厅作为一种利用虚拟现实技术构建的三维展示空间&#xff0c;其应用场景广泛且多样。视创云展为企业虚拟展厅搭建提供技术支持。以下是一些主要的应用场景&#xff1a; 1. 博物馆和艺术展览 文物保护与展示&#xff1a; 在博物馆中&#xff0c;为了保护珍贵的文物和艺术…

【node.js】基础之修改文件

node.js 基础(一) node.js是什么&#xff1f; 上面这句话的意思就是&#xff1a;Node.js 是一个开源的&#xff0c;跨平台的javascript运行环境。通俗的说就是一个应用程序或者说是一个软件&#xff0c;可以运行javascript。 Node.js的作用&#xff1a; 开发服务器应用。 将数…

nvidia-cuda-tensorrt-cudnn下载网站

tensorrt:https://developer.nvidia.com/tensorrt/download cudnn:https://developer.nvidia.com/rdp/cudnn-archive cuda:https://developer.nvidia.com/cuda-toolkit-archive

Mybatis---代理设计模式(超详细)

Mybatis—代理设计模式 文章目录 Mybatis---代理设计模式一、什么是代理设计模式二、静态代理1、定义2、结构3、示例 三、动态代理1、定义2、newProxyInstance &#xff08;&#xff09;方法3、示例 四、CGLIB代理1、引入2、定义3、工作原理4、示例 一、什么是代理设计模式 首…

AI基础 L1 Introduction to Artificial Intelligence

什么是AI Chinese Room Thought Experiment 关于“强人工智能”的观点&#xff0c;即认为只要一个系统在行为上表现得像有意识&#xff0c;那么它就真的具有理解能力。 实验内容如下&#xff1a; 假设有一个不懂中文的英语说话者被关在一个房间里。房间里有一本用英文写的中…

鸿蒙开发基础知识-页面布局【第四篇】

1.类型转换 2.交互点击事件 3.状态管理 4.forEch渲染和右上角图标 测试案例 Stack 层叠布局一个生肖卡 5. 动画展示图片 6. Swiper 轮播组件的基本使用 图片等比显示 aspectRatio&#xff08;&#xff09;