不久前遇到一个bug,某个用户的苹果手机钉钉小程序打开后弹窗提示错误,出现白屏(安卓手机打开直接白屏),研究了半天发现是他的钉钉版本过低(钉钉客户端版本低于5.1.5)
导致无法使用。
查看钉钉官方文档得知是由于钉钉V1引擎不支持部分API,导致程序报错,所以才会出现白屏和弹窗提示的问题。
点击下方链接
查看官方解释
小程序引擎升级
https://developers.dingtalk.com/document/app/mini-program-engine-upgrade
那如何解决这个问题呢?
官方提示可以通过基础库的版本判断当前运行在哪个版本的引擎上。所以按照这个思路开始找解决办法…
首先分析钉钉基础库的版本是比较常见的1.1.x类型,这样大大降低了比较的难度,于是开始在网上查找版本号的比较方法,基本思路都是字符串'.'切割
,然后循环依次比较版本号每一位大小
。
最后想了一个笨办法:
先将
当前版本
和旧版本
进行字符串’.'切割,每一位数前补零,最高三位数,然后将补零后的每一位重新拼接成字符串,转为数字后进行差值比较。
/**
* @description 比较客户端版本号,判断V1引擎还是v2引擎
* @param {current} 当前版本 如1.1.1
* @param {base} 基础版本 如1.2.1
*/
function versonCompare(current, base) {
const arr1 = current.split('.') // ['1','1','1']
const arr2 = base.split('.') // ['1','2','1']
function pad(num, n) {
let len = num.toString().length;
while (len < n) {
num = "0" + num;
len++;
}
return num;
}
const v1 = +(arr1.map(element => {
return pad(element, 3) // 001 001 001
}).join('')) // 1001001
const v2 = +(arr2.map(element => {
return pad(element, 3) // 001 002 001
}).join('')) // 1002001
return v1 - v2 > 0 // true 当前版本是最新版本;false 当前版本不是最新版本
}
// 判断是V1引擎还是V2引擎
export function isVersion() {
const version = dd.ExtSDKVersion || dd.SDKVersion; // 获取当前钉钉版本库版本号
return versonCompare(version, '1.24.0')
}
这样比较版本号的问题解决了。
按理说比较版本号的方法应该是在onLaunch
中调用,但是由于接口中需要传小程序的appid,appid通过dd.getAppIdSync().appId
方法获取,而该方法V1引擎不支持。
并且由于钉钉小程序加载问题,故只能每次调用接口时进行版本号的判断,如果是V1引擎就提示用户升级钉钉应用。