feat(upgrade): 优化版本更新检测流程并添加问题版本修复机制
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { requestUpdatePackage } from '@/api/modules/sys'
|
||||
import { requestUpdatePackage, checkProblemVersion } from '@/api/modules/sys'
|
||||
import { getMaxVersion } from './tools'
|
||||
import { getFileExtension } from '@/utils'
|
||||
|
||||
@@ -8,19 +8,34 @@ import { getFileExtension } from '@/utils'
|
||||
export default async function checkUpdate() {
|
||||
// #ifdef APP-PLUS
|
||||
try {
|
||||
const upgradeData = await getUpgradeCheckData()
|
||||
/** ① 先判断是否问题版本 */
|
||||
const currentVersion = await getCurrentVersion()
|
||||
if (!currentVersion) {
|
||||
throw new Error('获取当前版本号失败')
|
||||
}
|
||||
|
||||
// 优先调用 uni-upgrade-center(3 秒超时)
|
||||
const problemRes = await checkProblemVersion('10', currentVersion)
|
||||
if (!!problemRes?.updateUrl) {
|
||||
console.warn('命中问题版本,使用修复更新包更新')
|
||||
return handleBackupResponse(problemRes)
|
||||
}
|
||||
|
||||
/** ② 非问题版本,再走 uni-upgrade-center(3 秒超时) */
|
||||
console.log('当前客户端无问题,继续uniCloud版本检测')
|
||||
const upgradeData = await getUpgradeCheckData()
|
||||
const result = await withTimeout(
|
||||
callUpgradeCenter(upgradeData),
|
||||
3000
|
||||
)
|
||||
|
||||
console.log('检查版本更新成功:', result)
|
||||
console.log('uniCloud 检测成功:', result)
|
||||
return result
|
||||
|
||||
} catch (err) {
|
||||
console.warn('uniCloud更新方案失败,启用备用方案:', err?.message)
|
||||
return await useBackupUpdate()
|
||||
/** ③ uniCloud 异常兜底 */
|
||||
throw '更新检测失败, 如需升级请卸载后重新安装'
|
||||
// console.warn('uniCloud 更新检测失败,启用备用方案')
|
||||
// return await useBackupUpdate()
|
||||
}
|
||||
// #endif
|
||||
|
||||
@@ -29,6 +44,24 @@ export default async function checkUpdate() {
|
||||
// #endif
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理备用更新响应
|
||||
*/
|
||||
function handleBackupResponse(res) {
|
||||
return {
|
||||
result: {
|
||||
url: res.updateUrl,
|
||||
platform: ['Android', 'Ios'],
|
||||
type: getFileExtension(res.updateUrl),
|
||||
is_mandatory: true,
|
||||
is_backup_update: true,
|
||||
title: "更新",
|
||||
contents: "当前版本已经弃用,请立即更新",
|
||||
...res,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 备用更新方案
|
||||
*/
|
||||
@@ -39,26 +72,17 @@ async function useBackupUpdate() {
|
||||
throw { message: '获取当前版本号失败' }
|
||||
}
|
||||
|
||||
console.log('当前版本号:', currentVersion)
|
||||
try {
|
||||
const res = await requestUpdatePackage('10', currentVersion)
|
||||
|
||||
const res = await requestUpdatePackage('10', currentVersion)
|
||||
|
||||
if (!res || !res.updateUrl) {
|
||||
throw { message: '没有匹配的更新包,当前版本无需升级,如您确定有更新,请卸载本版本后前往应用市场重新安装' }
|
||||
}
|
||||
|
||||
// 将服务器返回的更新信息转换为 uni-upgrade-center 格式
|
||||
return {
|
||||
result: {
|
||||
...res,
|
||||
url: res.updateUrl,
|
||||
platform: ['Android', 'Ios'],
|
||||
type: getFileExtension(res.updateUrl),
|
||||
is_mandatory: true,
|
||||
is_backup_update: true,
|
||||
title: "更新",
|
||||
contents: "当前版本已经弃用,请立即更新",
|
||||
if (!res || !res.updateUrl) {
|
||||
throw { message: '没有匹配的更新包,当前版本无需升级,如您确定有更新,请卸载本版本后前往应用市场重新安装' }
|
||||
}
|
||||
// 将服务器返回的更新信息转换为 uni-upgrade-center 格式
|
||||
return handleBackupResponse(res)
|
||||
} catch (err) {
|
||||
console.warn('备用更新检测失败:', err)
|
||||
throw err.errMsg || err.message || '备用更新检测失败'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +91,11 @@ async function useBackupUpdate() {
|
||||
*/
|
||||
function callUpgradeCenter(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!uniCloud?.callFunction) {
|
||||
reject(new Error('uniCloud 未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
uniCloud.callFunction({
|
||||
name: 'uni-upgrade-center',
|
||||
data,
|
||||
@@ -83,7 +112,7 @@ function withTimeout(promise, timeout) {
|
||||
return Promise.race([
|
||||
promise,
|
||||
new Promise((_, reject) =>
|
||||
setTimeout(() => reject(new Error('请求超时')), timeout)
|
||||
setTimeout(() => reject(new Error('更新检测超时')), timeout)
|
||||
)
|
||||
])
|
||||
}
|
||||
|
||||
@@ -17,22 +17,23 @@ export default function() {
|
||||
platform, // 安装包平台
|
||||
type // 安装包类型
|
||||
} = e.result;
|
||||
|
||||
// 没有更新直接返回查询结果
|
||||
if (code === 0 && !is_backup_update) return resolve(e)
|
||||
|
||||
const hasUpdate = code > 0 || is_backup_update
|
||||
|
||||
// 如果不是备用更新,需要处理下载链接
|
||||
if (!is_backup_update) {
|
||||
const {
|
||||
fileList
|
||||
} = await uniCloud.getTempFileURL({
|
||||
fileList: [url]
|
||||
});
|
||||
e.result.url = fileList[0].tempFileURL;
|
||||
}
|
||||
|
||||
// 此处逻辑仅为实例,可自行编写
|
||||
// 如果有更新,根据是否静默更新选择不同处理方式
|
||||
if (hasUpdate) {
|
||||
resolve(e)
|
||||
// 如果不是备用更新,需要处理下载链接
|
||||
if (!is_backup_update) {
|
||||
const {
|
||||
fileList
|
||||
} = await uniCloud.getTempFileURL({
|
||||
fileList: [url]
|
||||
});
|
||||
e.result.url = fileList[0].tempFileURL;
|
||||
}
|
||||
|
||||
// 静默更新,只有wgt有
|
||||
if (is_silently) {
|
||||
@@ -75,10 +76,9 @@ export default function() {
|
||||
console.error(message)
|
||||
return reject(e)
|
||||
}
|
||||
return resolve(e)
|
||||
}).catch(err => {
|
||||
// TODO 云函数报错处理
|
||||
console.error(err.message)
|
||||
console.error(err)
|
||||
reject(err)
|
||||
})
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user