index.obj.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // 开发文档: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
  2. module.exports = {
  3. checkVersion: async function(event) {
  4. /**
  5. * 检测升级 使用说明
  6. * 上传包:
  7. * 1. 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
  8. * 2. 先从数据库取出所有该平台(从上下文读取平台信息,默认 Andriod)的所有线上发行更新
  9. * 3. 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
  10. * 4. 使用上步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新,必须同时大于这两项,否则返回暂无更新
  11. * 5. 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
  12. */
  13. const clientInfo = this.getClientInfo()
  14. let {
  15. appid,
  16. appVersion,
  17. wgtVersion,
  18. } = event;
  19. const platform_Android = 'Android';
  20. const platform_iOS = 'iOS';
  21. const package_app = 'native_app';
  22. const package_wgt = 'wgt';
  23. const app_version_db_name = 'opendb-app-versions'
  24. let platform = platform_Android;
  25. platform = clientInfo.OS === 'android' ?
  26. platform_Android :
  27. clientInfo.OS === 'ios' ?
  28. platform_iOS :
  29. platform_Android;
  30. if (appid && appVersion && wgtVersion && platform) {
  31. const collection = uniCloud.database().collection(app_version_db_name);
  32. const record = await collection.where({
  33. appid,
  34. platform,
  35. stable_publish: true
  36. })
  37. .orderBy('create_date', 'desc')
  38. .get();
  39. if (record && record.data && record.data.length > 0) {
  40. const appVersionInDb = record.data.find(item => item.type === package_app) || {};
  41. const wgtVersionInDb = record.data.find(item => item.type === package_wgt) || {};
  42. const hasAppPackage = !!Object.keys(appVersionInDb).length;
  43. const hasWgtPackage = !!Object.keys(wgtVersionInDb).length;
  44. // 取两个版本中版本号最大的包,版本一样,使用wgt包
  45. let stablePublishDb = hasAppPackage ?
  46. hasWgtPackage ?
  47. compare(wgtVersionInDb.version, appVersionInDb.version) >= 0 ?
  48. wgtVersionInDb :
  49. appVersionInDb :
  50. appVersionInDb :
  51. wgtVersionInDb;
  52. const {
  53. version,
  54. min_uni_version
  55. } = stablePublishDb;
  56. // 库中的version必须满足同时大于appVersion和wgtVersion才行,因为上次更新可能是wgt更新
  57. const appUpdate = compare(version, appVersion) === 1; // app包可用更新
  58. const wgtUpdate = compare(version, wgtVersion) === 1; // wgt包可用更新
  59. if (Object.keys(stablePublishDb).length && appUpdate && wgtUpdate) {
  60. // 判断是否可用wgt更新
  61. if (min_uni_version && compare(min_uni_version, appVersion) < 1) {
  62. return {
  63. code: 101,
  64. message: 'wgt更新',
  65. ...stablePublishDb
  66. };
  67. } else if (hasAppPackage && compare(appVersionInDb.version, appVersion) === 1) {
  68. return {
  69. code: 102,
  70. message: '整包更新',
  71. ...appVersionInDb
  72. };
  73. }
  74. }
  75. return {
  76. code: 0,
  77. message: '当前版本已经是最新的,不需要更新'
  78. };
  79. }
  80. return {
  81. code: -101,
  82. message: '暂无更新或检查appid是否填写正确'
  83. };
  84. }
  85. return {
  86. code: -102,
  87. message: '请检查传参是否填写正确'
  88. };
  89. }
  90. }
  91. /**
  92. * 对比版本号,如需要,请自行修改判断规则
  93. * 支持比对 ("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") 之类的
  94. * @param {Object} v1
  95. * @param {Object} v2
  96. * v1 > v2 return 1
  97. * v1 < v2 return -1
  98. * v1 == v2 return 0
  99. */
  100. function compare(v1 = '0', v2 = '0') {
  101. v1 = String(v1).split('.')
  102. v2 = String(v2).split('.')
  103. const minVersionLens = Math.min(v1.length, v2.length);
  104. let result = 0;
  105. for (let i = 0; i < minVersionLens; i++) {
  106. const curV1 = Number(v1[i])
  107. const curV2 = Number(v2[i])
  108. if (curV1 > curV2) {
  109. result = 1
  110. break;
  111. } else if (curV1 < curV2) {
  112. result = -1
  113. break;
  114. }
  115. }
  116. if (result === 0 && (v1.length !== v2.length)) {
  117. const v1BiggerThenv2 = v1.length > v2.length;
  118. const maxLensVersion = v1BiggerThenv2 ? v1 : v2;
  119. for (let i = minVersionLens; i < maxLensVersion.length; i++) {
  120. const curVersion = Number(maxLensVersion[i])
  121. if (curVersion > 0) {
  122. v1BiggerThenv2 ? result = 1 : result = -1
  123. break;
  124. }
  125. }
  126. }
  127. return result;
  128. }