feat(upgrade): 优化版本更新检测流程并添加问题版本修复机制

This commit is contained in:
2025-12-29 18:07:29 +08:00
parent b2bff1ed54
commit ec869f0395
6 changed files with 94 additions and 47 deletions

View File

@@ -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-center3 秒超时)
const problemRes = await checkProblemVersion('10', currentVersion)
if (!!problemRes?.updateUrl) {
console.warn('命中问题版本,使用修复更新包更新')
return handleBackupResponse(problemRes)
}
/** ② 非问题版本,再走 uni-upgrade-center3 秒超时) */
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)
)
])
}