check-update.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import callCheckVersion from './call-check-version'
  2. // 推荐再App.vue中使用
  3. const PACKAGE_INFO_KEY = '__package_info__'
  4. export default function() {
  5. // #ifdef APP-PLUS
  6. return new Promise((resolve, reject) => {
  7. callCheckVersion().then(async (e) => {
  8. if (!e.result) return;
  9. const {
  10. code,
  11. message,
  12. is_silently, // 是否静默更新
  13. url, // 安装包下载地址
  14. platform, // 安装包平台
  15. type // 安装包类型
  16. } = e.result;
  17. // 此处逻辑仅为实例,可自行编写
  18. if (code > 0) {
  19. // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
  20. const {
  21. fileList
  22. } = await uniCloud.getTempFileURL({
  23. fileList: [url]
  24. });
  25. if (fileList[0].tempFileURL)
  26. e.result.url = fileList[0].tempFileURL;
  27. resolve(e)
  28. // 静默更新,只有wgt有
  29. if (is_silently) {
  30. uni.downloadFile({
  31. url: e.result.url,
  32. success: res => {
  33. if (res.statusCode == 200) {
  34. // 下载好直接安装,下次启动生效
  35. plus.runtime.install(res.tempFilePath, {
  36. force: false
  37. });
  38. }
  39. }
  40. });
  41. return;
  42. }
  43. /**
  44. * 提示升级一
  45. * 使用 uni.showModal
  46. */
  47. // return updateUseModal(e.result)
  48. /**
  49. * 提示升级二
  50. * 官方适配的升级弹窗,可自行替换资源适配UI风格
  51. */
  52. uni.setStorageSync(PACKAGE_INFO_KEY, e.result)
  53. uni.navigateTo({
  54. url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`,
  55. fail: (err) => {
  56. console.error('更新弹框跳转失败', err)
  57. uni.removeStorageSync(PACKAGE_INFO_KEY)
  58. }
  59. })
  60. return
  61. } else if (code < 0) {
  62. // TODO 云函数报错处理
  63. console.error(message)
  64. return reject(e)
  65. }
  66. return resolve(e)
  67. }).catch(err => {
  68. // TODO 云函数报错处理
  69. console.error(err.message)
  70. reject(err)
  71. })
  72. });
  73. // #endif
  74. }
  75. /**
  76. * 使用 uni.showModal 升级
  77. */
  78. function updateUseModal(packageInfo) {
  79. const {
  80. title, // 标题
  81. contents, // 升级内容
  82. is_mandatory, // 是否强制更新
  83. url, // 安装包下载地址
  84. platform, // 安装包平台
  85. type // 安装包类型
  86. } = packageInfo;
  87. let isWGT = type === 'wgt'
  88. let isiOS = !isWGT ? platform.includes('iOS') : false;
  89. let confirmText = isiOS ? '立即跳转更新' : '立即下载更新'
  90. return uni.showModal({
  91. title,
  92. content: contents,
  93. showCancel: !is_mandatory,
  94. confirmText,
  95. success: res => {
  96. if (res.cancel) return;
  97. // 安装包下载
  98. if (isiOS) {
  99. plus.runtime.openURL(url);
  100. return;
  101. }
  102. uni.showToast({
  103. title: '后台下载中……',
  104. duration: 1000
  105. });
  106. // wgt 和 安卓下载更新
  107. downloadTask = uni.downloadFile({
  108. url,
  109. success: res => {
  110. if (res.statusCode !== 200) {
  111. console.error('下载安装包失败', err);
  112. return;
  113. }
  114. // 下载好直接安装,下次启动生效
  115. plus.runtime.install(res.tempFilePath, {
  116. force: false
  117. }, () => {
  118. if (is_mandatory) {
  119. //更新完重启app
  120. plus.runtime.restart();
  121. return;
  122. }
  123. uni.showModal({
  124. title: '安装成功是否重启?',
  125. success: res => {
  126. if (res.confirm) {
  127. //更新完重启app
  128. plus.runtime.restart();
  129. }
  130. }
  131. });
  132. }, err => {
  133. uni.showModal({
  134. title: '更新失败',
  135. content: err
  136. .message,
  137. showCancel: false
  138. });
  139. });
  140. }
  141. });
  142. }
  143. });
  144. }