微信小程序 - 一篇带你解读小程序强制更新(冷/热启动)
在小程序开发中,我们会不可避免的涉及到小程序新版本迭代的问题,因为小程序的更新机制是异步的,新版本发布后并不会立刻应用到所有的现有用户,部分用户用的可能还是原来的旧版本,但如果是急需修复的 bug 或其他急需上线的需求,我们就需要了解小程序的运行和更新机制,对小程序进行强制更新了。
运行机制
基本概念
- 小程序启动后,界面被展示给用户,此时小程序处于
前台状态 - 用户关闭小程序或离开微信,在短时间内小程序并不会被销毁,此时小程序处于
后台状态 - 这个时候如果用户再次进入到小程序,就是从后台状态切换到前台状态,此时小程序是
热启动 - 但如果用户过了很久都没有再进入小程序,那么这个时候小程序可能被销毁[1],等用户再次打开这个小程序,此时小程序需要重新加载启动,即
冷启动 - 如果用户是首次打开小程序,小程序也需要重新加载启动,那么这种情况也属于
冷启动
生命周期
如果想要了解小程序的生命周期,可以看这篇文章
冷启动的生命周期
- 冷启动的小程序,会先执行
app.js中的onLaunch和onShow,然后才是页面的生命周期:onLoad,onShow,onReady…
热启动的生命周期
- 热启动的小程序,会先执行
app.js中的onShow,然后执行页面的生命周期:onShow
更新机制
小程序的更新分为两种情况,一种是未启动时更新,一种是启动时更新。
未启动时更新
- 在发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。
- 微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。
- 总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。
- 用户下次打开时会先更新最新版本再打开。
启动时更新
- 小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动。
- 即新版本的小程序需要等下一次冷启动才会应用上。
- 如果需要马上应用最新版本,可以使用
wx.getUpdateManager进行处理。
强制更新
wx.getUpdateManager
wx.getUpdateManager(): 获取全局唯一的版本更新管理器,用于管理小程序更新,返回值是UpdateManager对象。UpdateManager.onCheckForUpdate():监听向微信后台请求检查更新结果事件。微信在小程序冷启动时自动检查更新,不需由开发者主动触发。返回值是个布尔值hasUpdate。UpdateManager.onUpdateReady():监听小程序有版本更新事件。客户端主动触发下载(无需开发者触发),下载成功后回调。UpdateManager.applyUpdate():强制小程序重启并使用新版本。在小程序新版本下载完成后(即收到onUpdateReady回调)调用。UpdateManager.onUpdateFailed():监听小程序更新失败事件。小程序有新版本,客户端主动触发下载(无需开发者触发),下载失败(可能是网络原因等)后回调。
代码实现
- 微信开发者工具上可以通过「编译模式」下的「下次编译模拟更新」开关来调试
- 小程序开发版/体验版没有「版本」概念,所以无法在开发版/体验版上测试版本更新情况
// app.js
onLaunch: function () {this.checkForUpdate();
},
// 检查是否有新版本
checkForUpdate: function () {if (wx.canIUse('getUpdateManager')) { // 判断getUpdateManager在当前版本是否可用const updateManager = wx.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调if (res.hasUpdate) { // 有新版本updateManager.onUpdateReady(function () {wx.showModal({title: '更新提示',content: '新版本已经准备好,是否重启应用?',success: function (res) {if (res.confirm) {// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启updateManager.applyUpdate();}}})})updateManager.onUpdateFailed(function () {// 新版本下载失败wx.showModal({title: '已经有新版本了哟~',content: '新版本已经上线,请您删除当前小程序,重新搜索打开哟~'})})}})} else {wx.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})}
}
热启动强制更新
我们刚看到上面的解决方案撑死只能做到『冷启动』强制更新,但是我们往往遇到的情景是想让用户及时更新最新的代码,因为可能遇到紧急BUG
小方案
通过对 hasUpdate 这个变量自定义后台接口 API,至于 true or false 根据具体业务情况进行分析,然后模拟微信小程序官方提供的模态框来进行处理,我们是根据手机号来进行是否需要更新判断。
我们只需要提供 2 个接口:一个根据手机号进行查询是否需要更新接口,另一个假设需要更新,更新完后会调用更新这个手机号的检查更新状态字段。
至于放在哪个位置,我们是放在 onShow,因为这样可以保证热部署!然后官方提供的方法就可以注释掉了,因为往往是因为想要清空缓存才出的解决方案~
相关文章:
微信小程序 - 一篇带你解读小程序强制更新(冷/热启动)
在小程序开发中,我们会不可避免的涉及到小程序新版本迭代的问题,因为小程序的更新机制是异步的,新版本发布后并不会立刻应用到所有的现有用户,部分用户用的可能还是原来的旧版本,但如果是急需修复的 bug 或其他急需上线…...
关于接口测试自动化的总结与思考!
序 近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于: 服务端接口测试介…...
如何用低代码的思路设计文字描边渐变组件
前言 文字特效设计一直是困扰 Web 前端 Css 世界多年的问题, 比如如何用纯 Css 实现文字描边, 渐变, 阴影等, 由于受限于浏览器兼容性的问题, 我们不得不使用其他替代方案来实现. 平时工作中我们使用 PS 等设计工具能很容易的实现文字渐变等特效, 但是随着可视化技术的成熟, 我…...
Linux 网络通信
(一)套接字Socket概念 Socket 中文意思是“插座”,在 Linux 环境下,用于表示进程 x 间网络通信的特殊文件 类型。本质为内核借助缓冲区形成的伪文件。 既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。Linux 系统…...
借力互联网,民营医院探索互联网医疗服务的发展方向
民营医院互联网医疗服务是指利用互联网技术和平台,为患者提供更加便捷、高效的医疗服务。在当前数字化时代,互联网医疗服务正逐渐成为医疗行业的新趋势,也为民营医院开拓了更广阔的发展空间。下面将围绕这一主题进行讨论: 首先&a…...
office tool plus工具破解word、visio等软件步骤
第一步:下载工具 破解需要用到office tool plus软件 office tool plus软件下载地址:Office Tool Plus 官方网站 - 一键部署 Office 选择其中一个下载到本地(本人选择的是第一个的云图小镇下载方式) 第二步:启动工具 …...
python之pyqt专栏5-信号与槽1
在上一篇文章,我们了解到如果想要用代码改变QLabel的文本内容,可以调用QLabel类的text()函数。 但是现在有个这样的需求,界面中有一个Button与一个Label,当点击Button时,将Label的内容改变为“Hello world!…...
【JMeter】不同场景下的接口请求
场景1: 上传文件接口即Content-Type=multipart/form-data 步骤: 1. 接口url,method以及path正常填写 2.文件上传content-type是multipart/form-data,所以可以勾选【use multipart/form-data】,如果还有其他请求头信息可以添加一个请求头元件 3.请求参…...
十八数字文化受邀参加版博会“区块链+版权”创新应用试点研讨会
2023年11月23日至25日,以“版权新时代 赋能新发展”为主题的第九届中国国际版权博览会在成都市中国西部国际博览城和天府国际会议中心举办。版博会是我国版权领域唯一的综合性、国际性、国家级版权专业博览会,本届版博会由国家版权局主办,四川…...
Centos 7 离线安装(tar) NodeJS 16 和 Vue
目录 一、下载Nodejs二、安装Nodejs2.1、创建安装目录2.2、上传安装包(无网络) or 直接下载(有网络)2.3、解压缩2.4、配置环境变量2.5、创建软连接2.6、更换镜像源2.7、验证是否安装成功 三、安装Vue四、卸载Nodejs 一、下载Nodejs Nodejs:https://nodejs.org/en/ …...
卸载软件最最最彻底的工具——Uninstall Tool
卸载软件最最最彻底的工具——Uninstall Tool Uninstall Tool 是一款功能强大的专业卸载工具。针对一些普通卸载不彻底的问题,它可以做到最优,比如Matlab等软件的卸载难的问题也可以较好地解决。 它比 Windows 自带的“添加/删除程序”功能快 3 倍&…...
2022年MathorCup大数据竞赛B题北京移动用户体验影响因素研究求解全过程文档及程序
2022年MathorCup高校数学建模挑战赛—大数据竞赛 B题 北京移动用户体验影响因素研究 原题再现: 移动通信技术飞速发展,给人们带来了极大便利,人们也越来越离不开移动通信技术带来的各种便捷。随着网络不断的建设,网络覆盖越来越…...
C#,《小白学程序》第二十课:大数的加法(BigInteger Add)
大数的(加减乘除)四则运算、阶乘运算。 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法。 重复了部分 19 课的代码。 1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary>…...
通用功能——git 攻略
摘要 本文主要介绍git常用命令的使用方法,同时介绍一些常见问题的处理方法,持续更新中… git命令通用选项 大多数git命令都适用的选项列表如下: -v, --verbose show hash and subject, give twice for upstream branch -q, --quie…...
LemMinX-Maven:帮助在eclipse中更方便地编辑maven的pom文件
LemMinX-Maven:https://github.com/eclipse/lemminx-maven LemMinX-Maven可以帮助我们在eclipse中更方便地编辑maven工程的pom.xml文件,例如补全、提示等。不用单独安装,因为在安装maven eclipse插件的时候已经自动安装了: 例…...
CAD与 PDM系统如何协同工作的?
在产品研发中,CAD(计算机辅助设计)和PDM(产品数据管理)是两个核心的工具,它们在产品从设计到制造的整个生命周期中发挥着重要的作用。虽然这两个工具在功能上有所不同,但它们在使用上却有着密切…...
vue-历史模式部署
项目部署 本项目采用nginx进行部署,历史模式的部署需要服务端的配合,本次采用nginx进行配合。 1 配置 const basePath process.env.VUE_APP_BASE_PATH; module.exports {publicPath: basePath #静态资源的路径 /ecology/ }2 创建路由 const createR…...
『Linux升级路』基础开发工具——make/Makefile
🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒…...
Python开发技能实战-如何在Visio中添加和删除任意连接点?
问题 在学习或者工作中,我们经常会借助Visio这个软件绘制流程图,在Visio中一般连接点是固定的,固定的连接点只能绘制一条连接线,如下图所示: 但有时候我们需要在两个方框之间绘制双向连接线,达到以下的效果…...
中科驭数受邀出席2023 ODCC冬季全会,共谋开放数据中心创新发展
近日,2023年开放数据中心委员会(简称“ODCC”)冬季全会在宁夏银川成功召开,中科驭数作为ODCC的新成员单位,受邀出席本次重要会议。 ▲ 中科驭数正式加入ODCC开放数据中心委员会 开放数据中心委员会是在中国通信标准化…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
