index.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. 'use strict';
  2. module.exports = async (event, context) => {
  3. /**
  4. * 检测升级 使用说明
  5. * 上传包:
  6. * 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
  7. * 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新
  8. * 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
  9. * 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新
  10. * 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
  11. * 6. is_uniapp_x 为了区分 App 类型,uni-app x 项目安卓端没有 wgt 升级
  12. */
  13. let {
  14. appid,
  15. appVersion,
  16. wgtVersion,
  17. is_uniapp_x = false
  18. } = event;
  19. const platform_Android = 'Android';
  20. const platform_iOS = 'iOS';
  21. const platform_Harmony = 'Harmony';
  22. const package_app = 'native_app';
  23. const package_wgt = 'wgt';
  24. const app_version_db_name = 'opendb-app-versions'
  25. let platform = platform_Android;
  26. // 云函数URL化请求
  27. if (event.headers) {
  28. let body;
  29. try {
  30. if (event.httpMethod.toLocaleLowerCase() === 'get') {
  31. body = event.queryStringParameters;
  32. } else {
  33. body = JSON.parse(event.body);
  34. }
  35. } catch (e) {
  36. return {
  37. code: 500,
  38. msg: '请求错误'
  39. };
  40. }
  41. appid = body.appid;
  42. appVersion = body.appVersion;
  43. wgtVersion = body.wgtVersion;
  44. if (/iPhone|iPad/.test(event.headers)) {
  45. platform = platform_iOS
  46. } else if (/Android|android/.test(event.headers)) {
  47. platform = platform_Android
  48. } else {
  49. platform = platform_Harmony
  50. }
  51. } else if (context.OS) {
  52. platform = context.OS === 'android' ?
  53. platform_Android :
  54. context.OS === 'ios' ?
  55. platform_iOS :
  56. context.OS === 'harmonyos' ?
  57. platform_Harmony :
  58. platform_Android;
  59. }
  60. if (appid && appVersion && wgtVersion && platform) {
  61. const collection = uniCloud.database().collection(app_version_db_name);
  62. const record = await collection.where({
  63. appid,
  64. platform,
  65. stable_publish: true
  66. })
  67. .orderBy('create_date', 'desc')
  68. .get();
  69. if (record && record.data && record.data.length > 0) {
  70. const appVersionInDb = record.data.find(item => item.type === package_app) || {};
  71. const wgtVersionInDb = record.data.find(item => item.type === package_wgt) || {};
  72. const hasAppPackage = !!Object.keys(appVersionInDb).length;
  73. const hasWgtPackage = !!Object.keys(wgtVersionInDb).length;
  74. // 取两个版本中版本号最大的包,版本一样,使用wgt包
  75. let stablePublishDb = (() => {
  76. // uni-app x 项目安卓端没有 wgt 升级
  77. if (is_uniapp_x === true && platform === platform_Android) {
  78. if (hasAppPackage) return appVersionInDb
  79. return {}
  80. }
  81. if (hasAppPackage && hasWgtPackage) {
  82. if (compare(wgtVersionInDb.version, appVersionInDb.version) >= 0)
  83. return wgtVersionInDb
  84. else {
  85. return appVersionInDb
  86. }
  87. } else if (hasAppPackage) {
  88. return appVersionInDb
  89. } else if (hasWgtPackage) {
  90. return wgtVersionInDb
  91. }
  92. return {}
  93. })();
  94. if (Object.keys(stablePublishDb).length) {
  95. const {
  96. version,
  97. min_uni_version
  98. } = stablePublishDb;
  99. // 库中的version必须满足同时大于appVersion和wgtVersion才行,因为上次更新可能是wgt更新
  100. const appUpdate = compare(version, appVersion) === 1; // app包可用更新
  101. const wgtUpdate = compare(version, wgtVersion) === 1; // wgt包可用更新
  102. if (appUpdate && wgtUpdate) {
  103. // 判断是否可用wgt更新
  104. if (min_uni_version && compare(min_uni_version, appVersion) < 1) {
  105. return {
  106. code: 101,
  107. message: 'wgt更新',
  108. ...stablePublishDb
  109. };
  110. } else if (hasAppPackage && compare(appVersionInDb.version, appVersion) === 1) {
  111. return {
  112. code: 102,
  113. message: '整包更新',
  114. ...appVersionInDb
  115. };
  116. }
  117. }
  118. }
  119. return {
  120. code: 0,
  121. message: '当前版本已经是最新的,不需要更新'
  122. };
  123. }
  124. return {
  125. code: -101,
  126. message: '暂无更新或检查appid是否填写正确'
  127. };
  128. }
  129. return {
  130. code: -102,
  131. message: '请检查传参是否填写正确'
  132. };
  133. };
  134. /**
  135. * 对比版本号,如需要,请自行修改判断规则
  136. * 支持比对 ("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") 之类的
  137. * @param {Object} v1
  138. * @param {Object} v2
  139. * v1 > v2 return 1
  140. * v1 < v2 return -1
  141. * v1 == v2 return 0
  142. */
  143. function compare(v1 = '0', v2 = '0') {
  144. v1 = String(v1).split('.')
  145. v2 = String(v2).split('.')
  146. const minVersionLens = Math.min(v1.length, v2.length);
  147. let result = 0;
  148. for (let i = 0; i < minVersionLens; i++) {
  149. const curV1 = Number(v1[i])
  150. const curV2 = Number(v2[i])
  151. if (curV1 > curV2) {
  152. result = 1
  153. break;
  154. } else if (curV1 < curV2) {
  155. result = -1
  156. break;
  157. }
  158. }
  159. if (result === 0 && (v1.length !== v2.length)) {
  160. const v1BiggerThenv2 = v1.length > v2.length;
  161. const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
  162. for (let i = minVersionLens; i < maxLensVersion.length; i++) {
  163. const curVersion = Number(maxLensVersion[i])
  164. if (curVersion > 0) {
  165. v1BiggerThenv2 ? result = 1 : result = -1
  166. break;
  167. }
  168. }
  169. }
  170. return result;
  171. }