149 lines
4.3 KiB
JavaScript
149 lines
4.3 KiB
JavaScript
// 开发文档: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
|
||
module.exports = {
|
||
checkVersion: async function(event) {
|
||
/**
|
||
* 检测升级 使用说明
|
||
* 上传包:
|
||
* 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
|
||
* 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新
|
||
* 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
|
||
* 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新
|
||
* 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
|
||
*/
|
||
|
||
const clientInfo = this.getClientInfo()
|
||
|
||
let {
|
||
appid,
|
||
appVersion,
|
||
wgtVersion,
|
||
} = event;
|
||
|
||
const platform_Android = 'Android';
|
||
const platform_iOS = 'iOS';
|
||
const package_app = 'native_app';
|
||
const package_wgt = 'wgt';
|
||
const app_version_db_name = 'opendb-app-versions'
|
||
|
||
let platform = platform_Android;
|
||
|
||
platform = clientInfo.OS === 'android' ?
|
||
platform_Android :
|
||
clientInfo.OS === 'ios' ?
|
||
platform_iOS :
|
||
platform_Android;
|
||
|
||
if (appid && appVersion && wgtVersion && platform) {
|
||
const collection = uniCloud.database().collection(app_version_db_name);
|
||
|
||
const record = await collection.where({
|
||
appid,
|
||
platform,
|
||
stable_publish: true
|
||
})
|
||
.orderBy('create_date', 'desc')
|
||
.get();
|
||
|
||
if (record && record.data && record.data.length > 0) {
|
||
const appVersionInDb = record.data.find(item => item.type === package_app) || {};
|
||
const wgtVersionInDb = record.data.find(item => item.type === package_wgt) || {};
|
||
const hasAppPackage = !!Object.keys(appVersionInDb).length;
|
||
const hasWgtPackage = !!Object.keys(wgtVersionInDb).length;
|
||
|
||
// 取两个版本中版本号最大的包,版本一样,使用wgt包
|
||
let stablePublishDb = hasAppPackage ?
|
||
hasWgtPackage ?
|
||
compare(wgtVersionInDb.version, appVersionInDb.version) >= 0 ?
|
||
wgtVersionInDb :
|
||
appVersionInDb :
|
||
appVersionInDb :
|
||
wgtVersionInDb;
|
||
|
||
const {
|
||
version,
|
||
min_uni_version
|
||
} = stablePublishDb;
|
||
|
||
// 库中的version必须满足同时大于appVersion和wgtVersion才行,因为上次更新可能是wgt更新
|
||
const appUpdate = compare(version, appVersion) === 1; // app包可用更新
|
||
const wgtUpdate = compare(version, wgtVersion) === 1; // wgt包可用更新
|
||
|
||
if (Object.keys(stablePublishDb).length && appUpdate && wgtUpdate) {
|
||
// 判断是否可用wgt更新
|
||
if (min_uni_version && compare(min_uni_version, appVersion) < 1) {
|
||
return {
|
||
code: 101,
|
||
message: 'wgt更新',
|
||
...stablePublishDb
|
||
};
|
||
} else if (hasAppPackage && compare(appVersionInDb.version, appVersion) === 1) {
|
||
return {
|
||
code: 102,
|
||
message: '整包更新',
|
||
...appVersionInDb
|
||
};
|
||
}
|
||
}
|
||
|
||
return {
|
||
code: 0,
|
||
message: '当前版本已经是最新的,不需要更新'
|
||
};
|
||
}
|
||
|
||
return {
|
||
code: -101,
|
||
message: '暂无更新或检查appid是否填写正确'
|
||
};
|
||
}
|
||
|
||
return {
|
||
code: -102,
|
||
message: '请检查传参是否填写正确'
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 对比版本号,如需要,请自行修改判断规则
|
||
* 支持比对 ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1") ("3.0.0.1", "3.0") ("3.1.1", "3.1.1.1") 之类的
|
||
* @param {Object} v1
|
||
* @param {Object} v2
|
||
* v1 > v2 return 1
|
||
* v1 < v2 return -1
|
||
* v1 == v2 return 0
|
||
*/
|
||
function compare(v1 = '0', v2 = '0') {
|
||
v1 = String(v1).split('.')
|
||
v2 = String(v2).split('.')
|
||
const minVersionLens = Math.min(v1.length, v2.length);
|
||
|
||
let result = 0;
|
||
for (let i = 0; i < minVersionLens; i++) {
|
||
const curV1 = Number(v1[i])
|
||
const curV2 = Number(v2[i])
|
||
|
||
if (curV1 > curV2) {
|
||
result = 1
|
||
break;
|
||
} else if (curV1 < curV2) {
|
||
result = -1
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (result === 0 && (v1.length !== v2.length)) {
|
||
const v1BiggerThenv2 = v1.length > v2.length;
|
||
const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
|
||
for (let i = minVersionLens; i < maxLensVersion.length; i++) {
|
||
const curVersion = Number(maxLensVersion[i])
|
||
if (curVersion > 0) {
|
||
v1BiggerThenv2 ? result = 1 : result = -1
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|