[小程序] 发版更新方案

背景

小程序每次发版更新,都需要反复的删除打开或清除缓存,以获取最新版本。更新的不及时导致不同用户查看的版本不同(有些用户会报Bug、测试也不方便验证新版本)。

方案

手动更新:由用户选择是否更新,如不更新,则不影响用户当前操作,但后台仍会异步更新

  1. 《优先使用本地版本设置》为是
  2. wx.getUpdateManager()

强制更新:保证用户使用最新版本,但强制下载新版,用户必须等待,也许他不关心新版

  1. 《优先使用本地版本设置》为否
  2. 《小程序最低可用版本》选择最新发布的版本

结论:因为小程序的强制更新只需修改后台配置,所以两种方案都要,代码上只用实现手动更新。当此次更新是破坏性的(严重 Bug 修复、模块大改等),就到后台配置强制更新。

实现

在《我的》页面增加「更新提示」(只在需要更新时显示),点击更新版本。

app.js

js 复制代码
App({
  globalData: {
    needUpdate: false,
    uploadDownloadFail: false,
  },

  // 监测是否有版本更新
  watchUpdate() {
    const updateManager = wx.getUpdateManager()
    updateManager.onUpdateReady(() => {
      // 有更新
      this.globalData.needUpdate = true
    })
    updateManager.onUpdateFailed(() => {
      // 有更新,但下载失败
      this.globalData.needUpdate = true
      this.globalData.uploadDownloadFail = true
    })
  },

  onLaunch(options) {
    this.watchUpdate()
  },
})

mine.js

js 复制代码
<view wx:if="{{ needUpdate }}" bind:tap="updateVersion">存在新版本,点击升级</view>
===============================================================
Page({
  /**
   * 页面的初始数据
   */
  data: {
    needUpdate: false,
    uploadDownloadFail: false,
  },

  // 同步 app.js 中的 needUpdate、uploadDownloadFail 变量值
  // 注意:每次都调用 getApp() 以获取最新值
  watchUpdate() {
    this.setData({
      needUpdate: getApp().globalData.needUpdate,
      uploadDownloadFail: getApp().globalData.uploadDownloadFail,
    })
    setInterval(() => {
      this.setData({
        needUpdate: getApp().globalData.needUpdate,
        uploadDownloadFail: getApp().globalData.uploadDownloadFail,
      })
    }, 5000)
  },

  // 更新版本
  updateVersion() {
    const { uploadDownloadFail } = this.data

    if (!uploadDownloadFail) {
      // 新版本下载成功
      wx.showModal({
        title: '更新提示',
        content: '新版本已经准备好,是否重启应用?',
        success: (res) => {
          if (res.confirm) {
            // 应用新版本并重启
            const updateManager = wx.getUpdateManager()
            updateManager.applyUpdate()
          }
        }
      })
    } else {
      // 新版本下载失败
      // wx.showToast({
      //   title: '新版本下载失败,请您尝试删除当前小程序,重新搜索打开!',
      //   icon: 'none',
      //   duration: 8000
      // })
      wx.restartMiniProgram({
        path: '/pages/index/index'
      })
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.watchUpdate()
  },
  
})

可扩展:

  • 显示版本号:wx.getAccountInfoSync().miniProgram.version
  • 增加更新公告,说明更新内容

最后

参考文章:

  1. developers.weixin.qq.com/miniprogram...
  2. mp.weixin.qq.com/s/dTDjRZjqd...

欢迎沟通交流。

相关推荐
爱勇宝13 分钟前
一个家庭成长小程序的 MVP 复盘:看到用户在用我很欣慰
微信小程序·产品·设计
这是个栗子1 天前
uni-app微信小程序开发:高频核心 API(三)
微信小程序·小程序·uni-app
quweiie1 天前
thinkphp8结合jwt与微信小程序接口鉴权
微信小程序·小程序·thinkphp接口·接口鉴权
didiplus3 天前
我在GitHub刷到一个诗词API,顺手写了款小程序
微信小程序
小码哥0683 天前
医院陪诊小程序怎么开发-医院陪诊小程序源码功能-微信小程序 医院健康陪诊陪护系统
微信小程序·小程序·医院陪诊·陪诊系统·陪诊陪诊
书中枫叶4 天前
从「上次几点喂奶」到全栈小程序:我做了个喂宝助手
mongodb·微信小程序·node.js
ssshooter4 天前
小程序分包页面报 "has not been registered yet" 的隐蔽根因:一个动态 import 拖垮整个分包
前端·javascript·微信小程序
JudithHuang6 天前
受够了带广告的单位换算 App,我自己做了一个微信小程序
微信小程序
小羊Yveesss6 天前
2026年如何自己搭建一个外贸网页?单页验证和完整网站的区别
微信小程序·小程序·开源
小羊Yveesss7 天前
2026年微信小程序搭建一般需要多长时间?不同方案周期和延期点
微信小程序·小程序