[小程序] 发版更新方案

背景

小程序每次发版更新,都需要反复的删除打开或清除缓存,以获取最新版本。更新的不及时导致不同用户查看的版本不同(有些用户会报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...

欢迎沟通交流。

相关推荐
WangHappy5 小时前
不写 Canvas 也能搞定!小程序图片导出的 WebView 通信方案
前端·微信小程序
小时前端10 小时前
微信小程序选不了本地文件?用 web-view + H5 一招搞定
前端·微信小程序·uni-app
icebreaker1 天前
Weapp-vite:原生模式之外,多一种 Vue SFC 选择
前端·vue.js·微信小程序
icebreaker1 天前
重走 Vue 长征路 Weapp-vite:编译链路与 Wevu 运行时原理拆解
前端·vue.js·微信小程序
大米饭消灭者4 天前
Taro是怎么实现一码多端的【底层原理】
微信小程序·taro
FliPPeDround5 天前
Vitest Environment UniApp:让 uni-app E2E 测试变得前所未有的简单
微信小程序·e2e·前端工程化
FliPPeDround5 天前
微信小程序自动化的 AI 新时代:wechat-devtools-mcp 智能方案
微信小程序·ai编程·mcp
码云数智-大飞5 天前
如何创建自己的小程序,码云数智与有赞平台对比
微信小程序
luffy54595 天前
微信小程序页面使用类似filter函数的wxs语法
微信小程序·小程序
Slow菜鸟5 天前
微信小程序开发(二)目录结构完全指南
微信小程序·小程序