微信小程序 - 一篇带你解读小程序强制更新(冷/热启动)

小程序开发中,我们会不可避免的涉及到小程序新版本迭代的问题,因为小程序更新机制是异步的,新版本发布后并不会立刻应用到所有的现有用户,部分用户用的可能还是原来的旧版本,但如果是急需修复的 bug 或其他急需上线的需求,我们就需要了解小程序的运行和更新机制,对小程序进行强制更新了。

运行机制

运行机制">基本概念

生命周期

如果想要了解小程序的生命周期,可以看这篇文章

冷启动的生命周期">冷启动的生命周期
  • 冷启动小程序,会先执行app.js中的onLaunchonShow,然后才是页面的生命周期:onLoadonShowonReady
热启动的生命周期">热启动的生命周期
  • 热启动小程序,会先执行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,因为这样可以保证热部署!然后官方提供的方法就可以注释掉了,因为往往是因为想要清空缓存才出的解决方案~


http://www.niftyadmin.cn/n/5219297.html

相关文章

linux 搭建Nginx网页(编译安装)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

【Python】python包相对导入问题及解决方案

报错信息 ImportError: attempted relative import with no known parent package 问题描述 在package目录下有a1.py文件和subpackage1目录。在subpackage1目录下有b1.py文件。现在b1.py文件中有这样一行代码:from …a1 import A1。在subpackage1目录下运行pytho…

vue3使用高德地图获取经纬度

首先 安装依赖 cnpm i amap/amap-jsapi-loader --save <script setup> import { onMounted, reactive, ref } from vue import AMapLoader from amap/amap-jsapi-loaderconst map ref(null) const mapData reactive({map: {},keyword: ,selectedLocation: {},selecte…

FlinkSql-Temporal Joins-Lookup Join

说明 在 Flink SQL 中&#xff0c;Temporal Joins 是一种常见的数据关联操作&#xff0c;特别适用于处理包含时间维度的数据。Lookup Join 是 Temporal Joins 的一种类型&#xff0c;它允许将流数据与维表数据进行关联。使用场景如下&#xff1a; 实时维度关联&#xff1a; 当…

沈阳陪诊系统|陪诊软件开发功能

陪诊小程序的出现它可以帮助患者或家属解决就医过程中的各种问题。根据数据显示&#xff0c;2021年中国陪诊市场规模约为36.7亿元&#xff0c;预计到2025年将达到100亿元。同时&#xff0c;在医疗行业数字化转型的大背景下&#xff0c;陪诊微信小程序作为一种创新的医疗服务模式…

Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)

ExcelUtil工具类(XSSFWorkbook读取和写入Excel)&#xff0c;入参和出参都是&#xff1a;List<Map<String,Object>> 一、读取Excel testdata.xlsx 1、new XSSFWorkbook对象 File file new File(filePath); FileInputStream fis new FileInputStream(…

freertos任务切换的现场保存、恢复(任务栈空间)深度分析(以RISC-V架构为例)

1、任务控制块在内存中的布局 RISC-V架构采用的减栈&#xff0c;即栈向低地址空间生长&#xff1b;在freertos中采用任务控制块&#xff08;TCB&#xff09;结构来表示一个任务每个任务有自己的任务栈&#xff0c;任务栈是紧挨着TCB的&#xff0c;且TCB在地址高位&#xff0c;任…

【git】工作中常用的命令

前言 一些工作学习中常用的git命令小合集 正文 git clone git clone 使用的账号密码 用https的链接&#xff0c;就是要用github/gitee对应的用户名和密码。 git clone 获取指定指定分支的指定commit版本 第一步&#xff1a; git clone [git-url] -b [branch-name] 第二步…