uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横)

app.vue文件里写

//app.vue里写
<script>
	export default {
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		},
		onLaunch: function() {
			let appVersion = ''
			uni.getSystemInfo({
				success: function(e) {
					appVersion = e.platform
				}
			})
			let that = this;
			uni.request({
				url: 'http://xxx.xxx.xxx:3000/xxx/xxx', //获取版本号接口。
				method: "POST",
				header: {
					'custom-header': 'application/json;' //自定义请求头信息
				},
				success: (res) => {
					const arr1 = uni.getSystemInfoSync().appVersion.split('.');
					const arr2 = res.data.split('.')
					if (parseInt(arr2[2]) > parseInt(arr1[2])) {
						uni.showModal({
							title: "版本更新",
							content: '检测到有新版本,是否更新', //更新描述
							confirmText: '立即更新',
							cancelText: '稍后进行',
							success: (r) => {
								if (r.confirm) {
									//如果是安卓直接更新下载
									if (appVersion === 'android') {
										uni.showLoading({
											title: '正在下载,请稍后'
										})
										uni.downloadFile({
											// 存放最新安装包的地址
											url: 'http://xxx.xxx.xxx:3000/apk/xxx/xxx.apk',
											success: (downloadResult) => {
												uni.hideLoading();
												if (downloadResult.statusCode ===200) {
													uni.hideLoading();
													plus.runtime.install(
														downloadResult
														.tempFilePath, {
															force: false
														},
														function() {
															console.log(
																'install success...'
																);
															plus.runtime
																.restart();
														},
														function(e) {
															uni.hideLoading();
															console.error(
																'install fail...'
																);
														});
												}
											}
										});
										//如果是ios跳转到app store
									} else {
										//在App Store Connect中的App Store下的app信息,可找到appleId
										let appleId = plus.runtime.appid
										plus.runtime.launchApplication({
											action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
										}, function(e) {
											uni.showToast({
												title: '打开应用商店失败'
											})
											console.log(
												'打开应用商店失败: ' +
												e.message);
										});
									}
								} else if (res.cancel) {
									console.log('用户点击取消');
								}
							}
						})
					}

				},

			});
		},
	}
</script>

<style>
	/*每个页面公共css */
</style>

二、详解(复制粘贴行不通呢,就详细看看每行的注释,相信我,花费三分钟时间,比你点开一堆链接去一步一步排查好。嘿嘿!除非你想摸鱼)

<script>
	export default {
		onLaunch: function() {
			let appVersion = ''
			uni.getSystemInfo({   //获取当前的apk是安卓还是ios,
				success: function(e) {
					appVersion = e.platform    // console打印的值为android
				}
			})
			let that = this;
			uni.request({
				url: 'http://xxx.xxx.xxx:3000/xxx/xxx', //获取版本号接口。
				method: "POST",
				header: {
					'custom-header': 'application/json;' //自定义请求头信息
				},
				success: (res) => {
				    //uni.getSystemInfoSync()返回的是apk包信息,uni自带,可自行打印查看.
					const arr1 = uni.getSystemInfoSync().appVersion.split('.');
					//arr2接口返回的版本信息(1.0.0),处理一下成数组。
					const arr2 = res.data.split('.')
					console.log(uni.getSystemInfoSync(), '这是uni.getSystemInfoSync()')
					console.log(arr1, '这是arr1')
					console.log(arr2, "这是arr2arr2")
					//parseInt(arr2[2]) > parseInt(arr1[2])我自己想偷懒,只校验最后一位版本号的大小,你要是想非常规矩校验版本号呢,就自己写写js逻辑,先判断第一位,在判断第二位,在判断第三位
					if (parseInt(arr2[2]) > parseInt(arr1[2])) {
						uni.showModal({
							title: "版本更新",
							content: '检测到有新版本,是否更新', //更新描述
							confirmText: '立即更新',
							cancelText: '稍后进行',
							success: (r) => {
								if (r.confirm) {
									//如果是安卓直接更新下载
									if (appVersion === 'android') {
										uni.showLoading({
											title: '正在下载,请稍后'
										})
										//这块用downloadFile下载最新的apk包,
										uni.downloadFile({
											// 存放最新安装包的地址
											url: 'http://xxx.xxx.xxx:3000/apk/xxx/xxx.apk',
											success: (downloadResult) => {
												uni.hideLoading();
												if (downloadResult.statusCode ===200) {
													uni.hideLoading();
													//plus.runtime.install这个是啥东西,别问,问了我也不知道,而且运行到浏览器还报错,那就对了,直接打包到真机上,相信自己没问题
													plus.runtime.install(
														downloadResult
														.tempFilePath, {
															force: false
														},
														function() {
															console.log(
																'install success...'
																);
															plus.runtime
																.restart();
														},
														function(e) {
															uni.hideLoading();
															console.error(
																'install fail...'
																);
														});
												}
											}
										});
										//如果是ios跳转到app store
									} else {
										//在App Store Connect中的App Store下的app信息,可找到appleId
										//这块ios更新,我还是不知道,因为我们只做安卓的,究竟管不管用,自己试试吧
										let appleId = plus.runtime.appid
										plus.runtime.launchApplication({
											action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
										}, function(e) {
											uni.showToast({
												title: '打开应用商店失败'
											})
											console.log(
												'打开应用商店失败: ' +
												e.message);
										});
									}
								} else if (res.cancel) {
									console.log('用户点击取消');
								}
							}
						})
					}

				},

			});
		},
	}
</script>

在这里插入图片描述

在这里插入图片描述

有疑问或者更好的实现方案可以评论一起探讨

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

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

相关文章

WSL2Linux 子系统(六)

WSL 连接USB WSL (Windows Subsystem for Linux) 是一种在 Windows 操作系统上运行 Linux 应用程序的兼容层。它的主要作用是提供了一个类似于虚拟机的环境&#xff0c;使得在 Windows 上开发和运行基于 Linux 的应用变得更加方便。然而&#xff0c;WSL 目前还不支持直接通过 …

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图&#xff1a; 使用单例模式的UML类图&#xff1a; 使用场景&#xff1a; 需要频繁创建或销毁的对象…

C++项目——云备份-⑤-数据管理模块的设计与实现

文章目录 专栏导读1.要管理的数据有哪些2.如何管理数据3.数据信息结构体设计与实现4.数据管理类设计5.数据管理类实现6.数据管理模块整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师…

05 网络和防火墙等其他

网络和其他 ifconfig : 主机ip地址查询

【Linux】安装VMWare虚拟机(安装配置)和配置Windows Server 2012 R2(安装配置连接vm虚拟机)以及环境配置

前言&#xff1a; 一、操作系统简介 1、什么是操作系统 操作系统是一种软件&#xff0c;它管理计算机系统的硬件和软件资源&#xff0c;并提供给用户和应用程序接口&#xff0c;使它们能够与计算机系统交互和运行。操作系统负责调度和分配系统资源&#xff0c;例如处理器、内存…

【QT】Qt控件不显示图标

问题描述 本人在跟着B站视频学习QT时&#xff0c;遇到了一件十分悲惨的事情&#xff0c;一模一样的步骤&#xff0c;我的图标却不能显示。 于是我上网查询一下解决方案&#xff0c;第一种&#xff0c;亲测没用&#xff1b;第二种亲测可以。 解决方法一 1、构建 -> 清理项目…

java springboot2.7 写一个本地 pdf 预览的接口

依赖方面 创建的是 接口web项目就好了 然后包管理工具打开需要这些 import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; imp…

JavaScript进阶知识汇总~

JavaScript 进阶 给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 1.原型链入门 1) 构造函数 当我们自定义一个函数时(箭头函数与生成器函数除外)&#xff0c;这个函…

嵌入式系统设计师考试笔记之操作系统基础复习笔记二

目录 3、任务管理 &#xff08;1&#xff09;嵌入式操作系统的任务管理可以分为 &#xff08;2&#xff09;进程 &#xff08;3&#xff09;线程 &#xff08;4&#xff09;任务 &#xff08;5&#xff09;任务的创建与中止 &#xff08;6&#xff09;任务的状态任务有三…

APP分发-CDN加速原理

摘要 CDN的全称是(Content Delivery Network)&#xff0c;即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0c;将网站的内容发布到最接近用户的网络”边缘“的节点&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的…

华为机试题:HJ4 字符串分隔

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…

Android APK瘦身实践:二次瘦身如何再减少大小?(4M—2.9M)

瘦身前 因为平时就考虑到大小的限制&#xff0c;所以很多工作已经做过了&#xff0c;如下列举现在的状态&#xff1a; 7.3M&#xff08;Debug版本&#xff09;和6.5M&#xff08;Release版本&#xff09; 开启minifyEnabled 开启shrinkResources 已经去除不相关的大型库 图片和…

基于 nodejs+vue旅游推荐系统 mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

华为数通方向HCIP-DataCom H12-831题库(多选题:81-100)

第81题 经典的网络转发方式是基于路由表转发。OpenFlow交换机的转发方式是基于流表转发。对于这两种转发方式,以下说法正确的有哪些选项? A、流表的匹配方式是同时匹配流量的MAC地址和IP地址。 B、路由表的匹配方式是匹配拥有最长掩码的目的网段路由 C、流表是变长的。一台网…

Openssl数据安全传输平台011:base64的使用

文章目录 1 base641.1 概念1.2 应用场景 2 base64 算法 &#xff08;重要&#xff09;3 openssl 中base64的使用3.1 BIO 操作3.2 base64 编码 -> bio链的写操作3.3 base64 解码 -> bio链的读操作 1 base64 1.1 概念 Base64是一种基于64个可打印字符来表示二进制数据的表…

一文5000字从0到1使用Jmeter实现轻量级的接口自动化测试(图文并茂)

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…

Win10中Pro/E鼠标滚轮不能缩放该怎么办?

Pro/E安装好后&#xff0c;鼠标滚轮不能缩放模型&#xff0c;该怎么办&#xff1f;问题多发生在win8/win10上&#xff0c;新装了PROE&#xff0c;发现滑动鼠标中键不能放大缩小。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件系统…

Android 11.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在11.0的系统开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 frameworks\base\packages\SystemUI\src\com\and…

使用docker部署flask接口服务 一

文章目录 一&#xff1a;说明二&#xff1a;dockerfile 参数说明1. 一般常用的 参数&#xff0c;以及它的含义2. 我自己的 dockerfile 三&#xff1a;示例操作1. Gunicorn Gevent启动服务的好处2. 用Gunicorn Gevent的好处&#xff1a;3. Gunicorn Gevent的 使用示例4. 创建…