| New file | 
|  |  |  | 
|---|
|  |  |  | 'use strict'; | 
|---|
|  |  |  | exports.main = async (event, context) => { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 检测升级 使用说明 | 
|---|
|  |  |  | * 上传包: | 
|---|
|  |  |  | * 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传 | 
|---|
|  |  |  | * 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新 | 
|---|
|  |  |  | * 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新 | 
|---|
|  |  |  | * 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新 | 
|---|
|  |  |  | * 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion | 
|---|
|  |  |  | */ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 云函数URL化请求 | 
|---|
|  |  |  | if (event.headers) { | 
|---|
|  |  |  | let body; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | if (event.httpMethod.toLocaleLowerCase() === 'get') { | 
|---|
|  |  |  | body = event.queryStringParameters; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | body = JSON.parse(event.body); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (e) { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | code: 500, | 
|---|
|  |  |  | msg: '请求错误' | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | appid = body.appid; | 
|---|
|  |  |  | appVersion = body.appVersion; | 
|---|
|  |  |  | wgtVersion = body.wgtVersion; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | platform = /iPhone|iPad/.test(event.headers) ? platform_iOS : platform_Android; | 
|---|
|  |  |  | } else if (context.OS) { | 
|---|
|  |  |  | platform = context.OS === 'android' | 
|---|
|  |  |  | ? platform_Android | 
|---|
|  |  |  | : context.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; | 
|---|
|  |  |  | } | 
|---|