'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; }