小程序开发必备的高级能力之七:更新
2019-02-21 本文已影响5人
甚时跃马归来
前言
在开发中,很多时候,线上项目有紧急Bug,要求我们紧急更新。但现有的小程序的更新逻辑是这样的:打开小程序--> 检查本地是否有下载的版本(有则更新) --> 检查线上是否有新的版本(有则下载)--> 正常使用 -->下次冷启动(也就是小程序不在内存中了)-->检查本地是否有下载的版本(有则更新)。
很明显,这样的流程很多时候不能满足项目的需求,好在官方提供了几个API,解决了这个问题。
更新的API
关于更新的API,总共有5个。分别是
- wx.getUpdateManager() // 返回全局唯一的版本更新管理器UpdateManager
- UpdateManager.applyUpdate() // 强制小程序重启并使用新版本。
- UpdateManager.onCheckForUpdate(function callback) // 监听向微信后台请求检查更新结果事件。function中接收的是1个对象,对象中有个值hasUpdate,是boolean值的结果
- UpdateManager.onUpdateFailed(function callback) // 监听小程序更新失败事件。
- UpdateManager.onUpdateReady(function callback) // 监听小程序有版本更新事件。下载成功后回调
实践
新版本小程序是主动触发下载(无需开发者触发)的,所以我们更多的是做一个提示及强制小程序版本重启更新的操作。而且只有启动时才调用到,所以我们一般写在app.js中。
主要app.js代码如下。
App({
onLaunch: function () {
let _this = this;
setTimeout(function(){
_this.checkVersion();
},2000)
},
checkVersion: function (){
let updateManager = wx.getUpdateManager();
updateManager.onCheckForUpdate(function (res) {
console.log(res)
if (res.hasUpdate) {
wx.showLoading({
title: '版本更新中,请稍等...',
})
} else {
console.log('无更新')
}
})
updateManager.onUpdateFailed(function () {
// 更新失败
})
updateManager.onUpdateReady(function () {
wx.hideLoading();
wx.showModal({
title: '新版本下载完成',
content: '即将重启进行更新',
showCancel: false,
success: function (res) {
if (res.confirm) {
updateManager.applyUpdate(); // 强制重启小程序
}
}
})
})
},
globalData: {
}
})
需要注意的是,这里的获取是否有更新的方法是异步的。所以我们可能在执行这段代码前,已经进入首页并执行请求数据的方法了。
所以,在这里,延迟了2s请求是否有新的版本,如果有则提示新版本下载中... 这样主要是为了防止数据请求有延迟时,wx.hideLoadding()把这里的提示给隐藏掉了。
真正开发中,建议还是自己写一个蒙层,上面加载一个自定义动画。这样可以防止网络差的时候,首页的数据请求完成后,调用wx.hideLoadding()把我们更新提示的提示信息给隐藏掉。这样的话,把检查更新的这段代码写在首页即可。