小程序更新机制

1,087 阅读2分钟

冷启动/热启动

  • 冷启动:小程序已被微信注销,再次打开(onLoad / onShow / onReady)
  • 热启动:小程序从后台切换到前台(onshow / onhide)

销毁机制

  • 小程序切换到后台,大概5min会被微信销毁
  • 微信短时间内(大概5s)连续2次出现内存警告,会销毁小程序

更新机制

  • 小程序只有再冷启动的情况下,如果发现新版本,才会下载新版本的代码包,并同时用客户端的版本进行启动,即新版版的小程序需要下一次冷启动才会应用
  • 微信版本再6.6.3及以上的用户,在小程序发布24小时内,用户再次打开小程序时同步更新新版本(不管是否为冷启动),用户会自动应用该新版本。
  • 微信版本在6.6.3以下的用户(可以通过判断基础库版本确定),可以用wx.getUpdateManager( ) 方法在需要提示用户的情况下,提示用户是否下载并应用最新的应用包

小程序,在更新时,有时需要使用wx.getUpdateManager( )方法,有时不需要,所以在使用时,为节省初始化时间,需要根据微信版本进行判断

// 获取用户设备信息
wx.getSystemInfo({
  success: (res) => {
    this.globalData.SDKVersion = res.SDKVersion // 客户端基础库版本
  }
})

// 比较 sdk 版本和 1.9.90 新旧 
// 因为 wx.getUpdateManager() 1.9.90 版本及以上才可以使用
// 版本比较参考:https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html
const compare_version = compareVersion(this.globalData.SDKVersion, '1.9.90')
if (compare_version >= 0) {
  const updateManager = wx.getUpdateManager()
  updateManager.onCheckForUpdate((res) => {
	  //onCheckForUpdate:监听小程序有版本更新事件。客户端主动触发下载(无需开发者触发),下载成功后回调
     // 限制提示更新的展示条件,避免在不需要时打扰用户使用
     // 开发者设置 && 有新版本需要更新
     if (this.globalData.forceUpdate && res.hasUpdate) {
     //this.globalData.forceUpdate 自定义 是否强制更新标识
      updateManager.onUpdateReady(() => {
        wx.showModal({
          title: '新版本已经准备好,是否重启应用',
          content: this.globalData.forceUpdateText,
          success: function (modalRes) {
            if (modalRes.confirm) {
              // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
              updateManager.applyUpdate()
            }
          }
        })
      })
     }
  })
} 

	function compareVersion(v1, v2) {
	  v1 = v1.split('.')
	  v2 = v2.split('.')
	  var len = Math.max(v1.length, v2.length)
	 
	  while (v1.length < len) {
	    v1.push('0')
	  }
	  while (v2.length < len) {
	    v2.push('0')
	  }
	 
	  for (var i = 0; i < len; i++) {
	    var num1 = parseInt(v1[i])
	    var num2 = parseInt(v2[i])
	 
	    if (num1 > num2) {
	      return 1
	    } else if (num1 < num2) {
	      return -1
	    }
	  }
	  return 0
	}
	 
	compareVersion('1.11.0', '1.9.9') // => 1 // 1表示 1.11.0比1.9.9要新
	compareVersion('1.11.0', '1.11.0') // => 0 // 0表示1.11.0和1.9.9是同一个版本
	compareVersion('1.11.0', '1.99.0') // => -1 // -1表示1.11.0比 1.99.0要老