阅读 1274

智能小程序档案馆——版本兼容

我们在进行小程序开发时,不可避免的需要根据不同版本,进行兼容性处理,可是有百度APP的版本,有swan.js的版本,TA们之间到底有什么样的关系,我们又要如何做版本兼容呢?今天的文章,将带领我们一起去探索答案~

百度APP版本 和 swan.js版本的区别和关联

首先,百度智能小程序版本相关有百度APP版本和swan.js版本两个概念。

  • 百度APP版本就是app本身的版本;

  • swan.js版本是百度智能小程序前端框架的版本,以客户端版本为主,这两者有规定的映射关系。

作为开发者,我们只需要关注 swan.js即可哦~

这里把百度APP的四位版本定义为a.b.c.d,swan.js的三位版本定义为x.y.z

在“11.0.x.x”的百度APP版本之前,swan.js版本的第一位与APP版本相差9,即:x=a-9

第二位与APP版本相同即:y=b。

第三位随版本递增。具体映射如下表:

百度APP版本swan.js版本
10.12.x.x1.12.x
10.13.x.x1.13.x

在“11.0.x.x”的百度APP版本之后,映射关系改为swan.js版本的第一位保持不变:x=a-9

第二位变为百度APP版本的第二位乘10加第三位即:y=b*10+c。

第三位随版本递增。具体映射如下表:

百度APP版本swan.js版本
11.0.5.x2.5.x
11.5.5.x2.55.x


如何兼容

大多数需要兼容的场景有如下两种,下面会列出解决方法。
1、兼容判断当前环境是否能使用某一API或某一组件或某一组件属性; 下文简称第一种场景。

2、某一API或某一组件属性在一个版本的返回值或表现与官方文档不一致;下文简称第二种场景。

针对第一种场景

可以通过canIUse或getSystemInfo方法判断想要使用的API或组件属性在当前环境是否可用。

具体操作如下所示:

1、使用canIUse

canIUse是非常建议大家使用的一种方法 ,一般是针对小程序框架本身的,用来判断智能小程序的API、回调、参数、组件和组件属性等是否在当前版本可用:

// 判断scroll-view组件的scroll-x属性在当前版本能否使用
if (swan.canIUse('scroll-view.scroll-x')) {
// 支持时的代码逻辑...
}
else {
// 不支持时的代码逻辑...
}复制代码
2、使用getSystemInfo或getSystemInfoSync

getSystemInfo可以获取系统信息,包括百度APP版本和swan.js版本,通过获取当前swan.js版本和想要使用的API或组件属性支持的版本进行比对,总而得到是否可用的结论。

// swan.request要求swan.js版本大于1.8.5,获取当前swan.js版本后比对
if (swan.getSystemInfoSync().SDKVersion > '1.8.5') {
// 支持时的代码逻辑...
}
else {
// 不支持时的代码逻辑... 
}复制代码

针对第二种场景

若发现在某一swan.js版本API的返回或组件的表现与官方文档不一致,那可能是我们的bug,请尽快反馈给我们。

在我们解决上线之前,有些问题开发者们可以通过使用上面getSystemInfo或getSystemInfoSync方法获取版本,比对是否是有问题的版本来做一些兼容处理。

例如:API返回数据对象的key不统一或返回数据的类型不统一等。

下面假设uploadFile进度回调中的progress属性在swan.js的1.10.12版本中传回是string类型,而不是官方文档上标注的number类型时可以这么处理:

const uploadTask = swan.uploadFile({
   url: 'https://smartprogram.baidu.com/xxx', //开发者服务器 url
   filePath: res.tempFilePaths[0], // 要上传文件资源的路径
   name: 'myfile'
});

uploadTask.onProgressUpdate(res => {
   let progress = res.progress;
   // 判断如果是1.10.12版本,转换一下类型
   if ('1.10.12' === swan.getSystemInfoSync().SDKVersion) {
       progress = +progress;
   }
   // 拿到获取的progress做的一系列操作...
});复制代码


关注下面的标签,发现更多相似文章
评论