uniapp之app版本更新,整体更新和热更新

news2024/9/26 5:24:29

目录

需求:

 版本更新有两种更新模式:

实现:

前提:

热更新:

打包wgt包:菜单->发行->原生App-制作移动App资源升级包

代码逻辑: 

整体更新:

实际项目开发:


 

需求:

工作中遇到一个需求,app上架各个市场后,用户   需要版本更新检验,下载最新的版本

 版本更新有两种更新模式:

  • 资源在线升级/热更新(即App并重新安装,里面的js等前端代码进行更新。)
  • 整包升级/整体更新(即常规的整个App安装包重新下载安装)

实现:

前提:

 每次升级之前,不管是热更新还是整体更新,都需要去更新 manifest.json 中的版本号

(比如之前是 1.0.0,那么新版本应该是 1.0.1 或 1.1.0 这样。)

热更新:

打包wgt包:菜单->发行->原生App-制作移动App资源升级包

代码逻辑: 
uni.downloadFile({  
			    url: 后端返的wgt的下载地址,  
			    success: (downloadResult) => {  
				  if (downloadResult.statusCode === 200) { 
					  
					  plus.runtime.install(downloadResult.tempFilePath, {  
						  force: false  //true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false。
					  }, function() {  
						  console.log('install success...');  
						  plus.runtime.restart();  //下载安装成功之后需要restart重启app
					  }, function(e) {  
						  console.error('install fail...');  
					  });  
				  }  
			    }  
			});  

整体更新:

const platform = uni.getSystemInfoSync().platform //手机平台	
uni.showModal({
		   	  title: '版本升级',
		   	  content: info.msg,
		   	  showCancel: false,
		   	  success: function (res) {
		  			   
		   	    if (res.confirm) {
		  				
		  				if(platform == 'android'){
		  					// 跳转安卓应用市场
		  					let appurl = "market://details?id=安卓包的包名" //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数
		  					plus.runtime.openURL(appurl)
		  					
		  				}else if(platform == 'ios'){
		  					const appleId = 对应的ios包的Appleid(不是appid)
		  					plus.runtime.launchApplication({
		  						action: `itms-apps://itunes.apple.com/cn/app/id${appleId}`,
		  					})
		  				}
		   	    }
		   	  }
		   	})

实际项目开发:

把热更新和整体更新代码逻辑融合在一起的,通过请求服务端返回的状态来控制是什么更新模式

  • 在请求头传输当前的版本version 

注意:获取version有两种方式,

plus.runtime.version 或者 uni.getSystemInfo() 读取到的是 apk/ipa 包的版本号,而非 manifest.json 资源中的版本信息,所以这里用 plus.runtime.getProperty() 来获取相关信息( plus.runtime.getProperty()获取信息是异步的所以注意执行顺序)。

let appVersion = '';
let appVersion2 = '';
// #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, (appInfo) => {
  // 获取版本名称
  appVersion = appInfo.version; //这个是异步的
  console.log(appInfo.version);
  // 获取版本号
  console.log(appInfo.versionCode);
  // 获取当前应用id
  console.log(appInfo.appid);
  console.log(plus.runtime.version)
});
appVersion2 = plus.runtime.version //这个是同步的

把获取到的版本号放在请求头中,这样就能检测到是否需要版本更新 

在App.vue中onLaunch生命周期里调用检测版本更新方法。

unpdate(){
		Api.apiverifyVersion().then(res=>{
			if (info.code === 1007) {
				  if(info.data.type === 1){
					  console.log(" info.data", info.data)
						uni.downloadFile({  
						    url: info.data.wgtUrl,  
						    success: (downloadResult) => {  
							  if (downloadResult.statusCode === 200) { 
								  console.log("downloadResult.tempFilePath",downloadResult.tempFilePath)
								  plus.runtime.install(downloadResult.tempFilePath, {  
									  force: false  //true表示强制安装,不进行版本号的校验;false则需要版本号校验,如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false。
								  }, function() {  
									  console.log('install success...');  
									  plus.runtime.restart();  
								  }, function(e) {  
									  console.error('install fail...');  
								  });  
							  }  
						    }  
						});  
				  }else if(info.data.type === 0){
					  const exists = uni.getStorageSync('version_expired') || false  ;//作用防止modal弹窗多次弹出
					  	
					  const platform = uni.getSystemInfoSync().platform //手机平台
					   if(!exists){
					   	uni.setStorageSync('version_expired', true)  
					   	uni.showModal({
					   	  title: '版本升级',
					   	  content: info.msg,
					   	  showCancel: false,
					   	  success: function (res) {
					  			  uni.setStorageSync('version_expired', false)  
					   	    if (res.confirm) {
					  				
					  				if(platform == 'android'){
					  					// 跳转安卓应用市场
					  					let appurl = "market://details?id=对应包id" //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数
					  					plus.runtime.openURL(appurl)
					  					
					  				}else if(platform == 'ios'){
					  					const appleId = 对应包的appleid
					  					plus.runtime.launchApplication({
					  						action: `itms-apps://itunes.apple.com/cn/app/id${appleId}`,
					  					})
					  				}
					   	    }
					   	  }
					   	})
					   }
					  
				  }
			} 
		})
	}
	

 参考借鉴文档:

uni-app 资源在线升级/热更新 - DCloud问答

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

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

相关文章

Linux网络编程——C/C++Web服务器(二):IO多路复用select/poll/epoll实现服务器监听多客户端事件

环境配置:windows电脑用户可以安装WSL配置Linux环境,并且安装vscode及wsl的插件通过vscode连接本机电脑的Linux。 前置内容: Linux网络编程——C/CWeb服务器(一):不断创建新线程处理多客户端连接和通信-C…

代码随想录算法训练营第二十七天(贪心 一)

硬拖拖到现在才写完。。。 关于贪心: 文章链接: 代码随想录 文章摘要: 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心算法并没有固定的套路。 和其他算法不同,贪心没有能看出局部最优是否能推出整体最优的通法。 用来验证可不可以…

软件渗透测试必要性简析,第三方软件测试机构如何进行渗透测试?

在信息技术迅速发展的今天,软件渗透测试逐渐成为了确保信息安全的重要环节。软件渗透测试指的是对系统或应用程序进行模拟攻击,以发现其潜在的安全风险与脆弱性。不同于传统的安全审计,渗透测试更注重实际攻击过程和攻击者的视角,…

IO进程线程8月26ri

1&#xff0c;思维导图 2&#xff0c;用两个进程分别复制文件的上下两部分到另一个文件 #include<myhead.h> int main(int argc, const char *argv[]) {int fpopen("./1.txt",O_RDONLY);if(fp-1){perror("open");return -1;}int countlseek(fp,0,SE…

如何在 mind+ 中编写 python 程序

打开Mind&#xff0c;点击窗口右上角的【Python模式】按钮&#xff0c;由实时模式切换到Python模式。 将默认的循环执行模块拖动到左边的模块区删除。 点击【变量】&#xff0c;将【打印【Hello World】】模块拼接到【Python主程序开始】下方。 将【获取输入&#xff0c;提示语…

redis(未授权访问漏洞)

环境准备 下载并安装Redis 首先&#xff0c;下载Redis的源代码包并解压&#xff1a; wget http://download.redis.io/releases/redis-2.8.17.tar.gz tar xzf redis-2.8.17.tar.gz cd redis-2.8.17接着&#xff0c;编译安装Redis&#xff1a; 编译完成后&#xff0c;进入src目录…

自动化任务工具 | zTasker v1.97.1 绿色版

在自动化任务管理领域&#xff0c;一款名为zTasker的软件以其卓越的性能和易用性脱颖而出。今天&#xff0c;电脑天空将为大家详细介绍这款软件的亮点和使用场景。 功能特点 1. 轻量级设计&#xff0c;快速启动 zTasker以其小巧的体积和快速的启动速度&#xff0c;为用户提供…

模型 7S分析法(麦肯锡)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。组织全面诊断&#xff0c;战略协同优化。 1 7S分析法(麦肯锡)的应用 1.1 邮储银行的转型&#xff1a;基于麦肯锡7S模型的竞争力提升 中国邮储银行面临着激烈的金融行业竞争&#xff0c;为了迅速提升…

考研数学 高等数学----导数应用

核心框架 前置知识 正式内容 知识点1: 知识点2: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知…

嵌入式系统课后习题(带答案)

资料截图&#xff08;部分&#xff09;&#xff1a; &#x1f680; 获取更多详细资料可点击链接进群领取&#xff0c;谢谢支持&#x1f447; 点击免费领取更多资料

Ant Design Vue中Modal.confirm无法自动关闭

温馨tips:着急看解决方法可跳过碎碎念~ 前两天经理扔给我一个问题&#xff1a;“这个弹窗怎么关不上了&#xff1f;” 我怀着无所谓的心态&#xff1a;小意思啦&#xff0c;5分钟之内解决完~ …当然flag是不能随便乱立的 拉下来项目&#xff08;原神启动&#xff08;不是&…

@ohos.systemParameterEnhance系统参数接口调用:获取系统属性

在去年的文章&#xff0c;笔者介绍了如何使用修改修改OpenHarmony 设备厂家名称 、硬件版本号 等系统属性&#xff0c;本文介绍一下在应用层怎么获取系统属性。 开发环境 DAYU200 rk3568开发板OpenHarmony 4.1r API 10 (full sdk)DevEco Studio 4.1 Release 开发步骤 1.首先…

浅谈【数据结构】树与二叉树之哈夫曼树

目录 1、哈夫曼树 1.1哈夫曼编码 1.2哈夫曼树 1.3构建一棵哈夫曼树 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧…

【FPGA数字信号处理】什么是信号?

在数字信号处理的奇妙世界里&#xff01;“信号”是一切的基础&#xff0c;理解了信号&#xff0c;就相当于拿到了开启数字信号处理大门的钥匙。 今天&#xff0c;就让我们一起深入探究数字信号处理基础中的“信号”。 一、信号的基本概念 信号&#xff0c;简单来说&#xf…

【持续更新】Mχ Plaayer Pro 1.86.0安卓知名播放器最新免费高级修改版

Mχ Plaayer Pro MOD 版本免费 APK&#xff0c;专为安卓手机和平板打造。这是一款功能强大的视频播放器&#xff0c;具备先进的硬件加速技术和字幕支持功能。 • 硬件加速 - 新增 HW 解码器帮助更多视频格式实现硬件加速。 • 多核心解码 - Mχ Plaayer 是首款支持多核心解码的…

链接 -- 动静态链接 --特点、区别、静态库安装下载

1.链接是什么&#xff1f; 我们的程序&#xff0c;和 库&#xff08;语言一定会有自己的标准库&#xff09; 结合的过程就叫做链接。 2.为什么有链接&#xff1f; 让开发站在巨人的肩膀&#xff0c;提高开发效率。 c语言库&#xff1a; ls /user/include/ 动静态库的特点与区别…

领域驱动设计DDD详解与战术建模落地

一、什么是DDD&#xff1f; 1.1、DDD的概念 Domain-Driven Design&#xff08;领域驱动设计&#xff09;它由Eric Evans在他的2003年出版的书籍《Domain-Driven Design: Tackling Complexity in the Heart of Software》中首次提出。DDD 核心思想是通过领域驱动设计方法定义领…

COMSOL工业碱性电解槽(3D、双欧拉模型)

本案例通过改写COMSOL官方案例获得&#xff0c;使用了碱性电解槽和欧拉-欧拉&#xff08;湍流&#xff09;模型&#xff0c;阳极室和阴极室带有乳突状的结构&#xff0c;模型进行了人为缩小&#xff0c;仅供参考。其中一些参数可参考如下链接文章的说明。COMSOL碱性电解槽参数解…

在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型

NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gemini Pro support. 一键免费部署你的跨平台私人 ChatGPT 应用, 支持 GPT3, GPT4 & Gemini Pro 模型。 主要功能 在 1 分钟内使用 Vercel 免费一键部署提供体积…

Cyberchef实用功能之-json解析美化和转换

本文将介绍如何使用cyberchef的json操作功能&#xff0c;根据自己的需求处理常见的json问题。 在网络安全日常的运营&#xff0c;护网行动&#xff0c;重保活动的过程中&#xff0c;经常需要查看多种平台的json格式日志&#xff0c;如下&#xff1a; 以json格式存储的防火墙日…