小程序中有 3 个版本号:
- 微信版本,现在 ios 是 8.0.40
- 基础库版本,现在是 3.0.0
- 小程序版本,开发者自己设置的
- glass-easal 组件框架,没有版本号
以上版本号都可以在启动小程序后,使用 wx.getSystemInfoSync() 获取。
微信版本平均每个月发一个版本,会涉及到 8 个平台,Android、iOS、Windows、Mac 和上述平台的企业微信。这 8 个平台通常不会同步更新,导致版本号会不一致。
基础库版本可以热更新,就是不需要微信发版也可以更新,但是微信客户端会限制它的上限。例如移动端基础库最高 3.0.0,mac 现在基础库最高 2.32.3,最低的是企业微信,iOS 移动端现在是 2.27.3。
最后是 glass-easal 组件框架,如果需要尝试 skyline 渲染模式,则强制要求打开它。打开后会全局影响小程序,包括没有使用 skyline 渲染的页面。目前它没有版本号,更新的机制微信官方文档并没有提及。这里提个 issue,看看官方是否能回答。
以上各种不同的版本,不同的平台,对开发者特别不友好。实际开发中,会发现使用的 api,低版本基础库无法使用。
甚至即使基础库版本满足了,部分 api 移动端可用,pc 端完全不可用,官方文档完全没说明。最离谱的是 api 调用了,走了 success 回调,实际上小程序界面上啥也没出现。这种情况就是需要等微信版本更新。
微信官方给出的解决方案,目前在小程序后台的设置里:
-
小程序最低可用版本——当用户下载最新版本小程序失败时,客户端会打开本地旧版本代码包
若该版本低于设置的最低版本要求,则无法打开,并继续尝试下载最新版本 -
基础库最低可用版本——若用户的基础库版本低于最低版本要求,则无法正常使用小程序,并提示更新微信版本
实际上,如果想让用户使用所有端的,最近 2 个版本的微信,会发现无法设置。
应对这个场景,官方也给出了解决方案,并提供了 2 个 api:
- wx.updateWeChatApp() 去更新微信
- wx.exitMiniProgram() 退出小程序
开发者需要自己写个升级页面,然后在首页和 app.ts 里检查微信版本,需要用户升级才能使用小程序时,跳转到自己写的升级页面,让用户点击按钮更新微信。iOS 会跳转 AppStore,其它客户端则直接跳转安装包下载页面。需要注意的是,即使当前微信已经是最新版了,也会跳转到 AppStore 或者下载页。
最后聊聊,如果微信新版本有 bug,影响到小程序了,如何要求回退微信版本呢?
首先,如果能忍受 bug,尽量不要回退,尽量想办法反馈官方;
其次,在 iOS 不可能回退微信,安卓也不建议,手机的应用商店也会有防御。
目前需要处理的大概率是版本落后的 mac、windows 端,需要开发者提前在官网保存好每个版本的微信安装包,然后自己做交互,并且在 CDN 保存安装包,利用小程序 api 做文件下载功能。