uni-app 在 APP 端的版本强制更新与热更新
整包更新与热更新的区别
① 整包更新是指下载完整 apk 文件进行覆盖安装
② 热更新是指把 app 有改动的地方打包进 wgt 文件,只更新 wgt 文件中的内容,不进行整包安装,在用户视角也叫做省流量更新
版本号规则约束
建议严格遵循 Semantic Versioning 2.0.0 语义化版本规范。
主版本号:不兼容的 API 修改。
次版本号:向下兼容的功能性新增。
修订号:向下兼容的问题修正。
实现的原理
① 开发后台版本管理功能,每次发版上传 android 安装包,记录版本号、是热更新还是整包更新、是否强制更新等。
② 每次打开 app(onLaunch生命周期)的时候,通过接口请求最新版本信息,再获取当前安装包信息,对比版本号。
③ 如果版本号不一致,且接口获取的版本号大于当前应用的版本号,则进行整包更新或热更新。
④ IOS 并不存在下载安装包覆盖安装这种操作,所以在 IOS 平台需要跳转到 App Store 进行更新。
onLaunch() {this.upgradeAPP(); // APP版本升级
},
在 methods 中
/* APP版本升级 */
upgradeAPP() {// #ifdef APP-PLUS// 只在正式环境下启用,避免更新影响开发和测试环境(这步取决于你的需求)if (process.env.NODE_ENV === "production") {// 获取 app 运行信息plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {// 通过接口获取最新版本信息getVersion({ platform: "1" }).then(res => {if (!res) return;// 版本号得到的是类似 '7.0.1' 的字符串,把它去除.并转为纯数字const appCode = parseInt(res.app_code.split(".").join(""));const version = parseInt(widgetInfo.version.split(".").join(""));// 只有接口版本号 > 当前包版本号才进行更新if (appCode > version && res.type == "0") {this.updateHot(res.download_url); // 热更新,下载更新文件(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)} else if (appCode > version && res.type == "1") {this.updatePackage(res.download_url); // 整包更新(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)}});});}// #endif
},
/* 整包更新 */
updatePackage(url) {// IOS 平台不允许这样更新,所以我们需要跳转到 appstore 进行更新if (uni.getSystemInfoSync().platform === "ios") {plus.runtime.launchApplication({ action: "itms-apps://xxx" }); // 调用第三方程序(链接可以通过接口获取)} else {// 构建了下载任务,但此时并未开始下载const dtask = plus.downloader.createDownload(url, {}, (downloadResult, status) => {if (status === 200) {plus.runtime.install(downloadResult.filename,{ force: false },() => {plus.runtime.restart(); // 安装成功后重启},() => {uni.showToast({ icon: "none", title: "下载更新失败" });});}});dtask.start(); // 执行安装包下载,开始下载任务}
},
/* 热更新 */
updateHot(url) {uni.downloadFile({url,success: downloadResult => {if (downloadResult.statusCode === 200) {// 下载更新文件成功后进行安装,force.是否强制安装(如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败)plus.runtime.install(downloadResult.tempFilePath, { force: false }, () => {uni.showToast({ title: "更新完毕,即将重启", icon: "none", position: "bottom", mask: true });setTimeout(() => {plus.runtime.restart(); // 安装完成后重启应用}, 2000);});}}});
}
参考:uniapp开发APP:强制更新和热更新
相关文章:
uni-app 在 APP 端的版本强制更新与热更新
整包更新与热更新的区别 ① 整包更新是指下载完整 apk 文件进行覆盖安装 ② 热更新是指把 app 有改动的地方打包进 wgt 文件,只更新 wgt 文件中的内容,不进行整包安装,在用户视角也叫做省流量更新 版本号规则约束 建议严格遵循 Semantic …...

实在智能受邀参加第14届珠中江数字化应用大会,AI赋能智能制造,共话“湾区经验”
制造业是实体经济的主体,是技术创新的主战场,是供给侧结构性改革的重要领域。抢占新一轮产业竞争制高点,制造业的数字化转型已成为行业升级的必由之路。 10月21日,第14届“珠中江”(珠海、中山、江门)数字…...
Qt 窗口的尺寸
默认尺寸 对于一个Qt的窗口(继承于QWidget),获取其窗体尺寸的方法size(); 以一个Qt创建Qt Widgets Application项目的默认生成代码为基础,做如下测试 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent…...

游戏数据分析对于运营游戏平台的重要性
游戏数据分析对于运营游戏平台具有至关重要的意义,它可以提供深入的见解,帮助了解玩家行为、偏好和互动,从而优化游戏体验,提高玩家参与度和留存率。 首先,通过游戏数据分析,运营者可以了解玩家在游戏中的表…...

微信群发消息的正确打开方式,让你的社交更高效!
在当今的社交媒体时代,微信已经成为了我们生活中必不可少的一部分。而微信的群发消息功能,让我们可以方便地将信息一次性发送给多个联系人。然而,微信的群发消息功能有一个限制,即每次只能群发200个联系人。这对于需要发送消息给大…...

HTML5语义化标签 header 的详解
🌟🌟🌟 专栏详解 🎉 🎉 🎉 欢迎来到前端开发之旅专栏! 不管你是完全小白,还是有一点经验的开发者,在这里你会了解到最简单易懂的语言,与你分享有关前端技术和…...

SpringCloud复习:(2)@LoadBalanced注解的工作原理
LoadBalanced注解标记了一个RestTemplate或WebClient bean使用LoadBalancerClient来进行负载均衡。 LoadBalancerAutoConfiguration类给带注解的RestTemplate添加了拦截器:LoadBalancerInterceptor. 具体流程如下: 首先定义一个LoadBalancerInterceptor…...
vue钩子函数以及例子
Vue.js 是一个基于组件化的前端框架,它提供了一些钩子函数,用于控制组件在不同阶段的行为和处理。以下是 Vue.js 常用的钩子函数以及它们的作用和示例: beforeCreate:在实例被创建之前调用。此时组件的数据、方法等还没有被初始化…...

redis场用命令及其Java操作
目录 1. Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 Redis下载 1.2.2 Redis安装 1.3 Redis服务启动与停止 1.3.1 服务启动命令 1.3.2 客户端连接命令 1.3.3 修改Redis配置文件 1.3.4 Redis客户端图形工具 2. Redis数据类型 2.1 五种常用数据类型介绍 2.2 …...

UG\NX二次开发 同时设置多个对象的高亮状态 UF_DISP_set_highlights
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 captainliubang 订阅本专栏,非常感谢。 简介 UG\NX二次开发 同时设置多个对象的高亮状态 UF_DISP_set_highlights 效果 代码(在for循环中逐个设置多个对象…...
Qt+树莓派4B 手动设置系统日期和时间
文章目录 前言一、设置日期二、设置时间 前言 某些设备需要在无网络环境下工作,系统时间和日期无法通过网络实时同步,此时就需要人为设置. 一、设置日期 QString m_date,m_time;QDateEdit *dateEdit new QDateEdit(this); dateEdit->setFixedSize(250,60); connect(date…...
用大顶堆和小顶堆实现优先队列
大顶堆小顶堆(或大根堆小根堆) 利用大顶堆实现优先队列,所谓大顶堆,容器内部元素是有序的,而且是按从大到小排序的(小顶堆刚好相反,从小到大)。容器只有一个出口一个入口࿰…...

PDCA项目开发环境搭建说明
PDCA项目开发环境搭建说明 环境准备 JDK 15.0 ; IDEA Community Edition 2021.3 版本要对应,不然会报错 Jdk 安装步骤:https://blog.csdn.net/qq_34913677/article/details/108894727 IDea 安装说明:https://blog.csdn.net/dream…...

Git简明教程
1.Git的定位 在我们自己开发项目的过程中,经常会遇到这样的情况,为了防止代码丢失,或者新变更的代码影响到原有的代码功能,为了在失误后能恢复到原来的版本,不得不复制出一个副本,比如:“坦克大战1.0”“坦…...
数据结构顺序表(C语言版)
目录 1.实现的接口及其功能2.代码块 1.实现的接口及其功能 //初始化顺序表void initSL(SL* p); //销毁顺序表 void DestorySL(SL* p); //头插 void PushFont(SL* p, SeqListType x); //尾插 void PushBack(SL* p, SeqListType x); //头删 void PopFont(SL* p); //尾删 void Pop…...

新手如何备考学习PMP?
一、PMP学习7步走攻略 1、熟悉考试大纲: PMP考试大纲是备考的基础,考生需要详细熟悉考试大纲,了解各个知识领域的重点和难点。 2、制定学习计划: 根据考试大纲和个人情况,制定学习计划,合理分配学习时间…...

[卷积神经网络]FasterNet论文解析
一、概述 FasterNet是CVPR2023的文章,通过使用全新的部分卷积PConv,更高效的提取空间信息,同时削减冗余计算和内存访问,效果非常明显。相较于DWConv,PConv的速度更快且精度也非常高,识别精度基本等同于大型…...

知识图谱+推荐系统 文献阅读
文献阅读及整理 知识图谱推荐系统 知识图谱 1 基于知识图谱的电商领域智能问答系统研究与实现 [1]蒲海坤. 基于知识图谱的电商领域智能问答系统研究与实现[D].西京学院,2022.DOI:10.27831/d.cnki.gxjxy.2021.000079. 知识点 BIO标记策略进行人工标记,构建了电商领域商品…...
shell_39.Linux参数测试
参数测试 在 shell 脚本中使用命令行参数时要当心。如果运行脚本时没有指定所需的参数,则可能会出问题: $ ./positional1.sh ./positional1.sh: line 5: ((: number < : syntax error: operand expected (error token is "< ") The …...

3D模型格式转换工具HOOPS Exchange助力SIMCON搭建注塑项目
行业:设计与制造 / 注塑成型 / 模拟 挑战:注塑成型商面临着以高效的方式为客户生产零件的挑战。需要大量的试验才能生产出适合的零件,同时模具需要进行多次物理修改,每次修改周期最长需要四个星期,成本高达四到五位数…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...