const GITEE_LATEST_RELEASE_API = 'https://gitee.com/api/v5/repos/li-hua-88/scanapp/releases/latest' const AUTO_UPDATE_CHECK_DATE_KEY = 'scanapp_auto_update_check_date' export function getCurrentAppVersion() { // #ifdef APP-PLUS return plus.runtime.version || '1.0.0' // #endif try { return uni.getSystemInfoSync().appVersion || '1.0.0' } catch (error) { return '1.0.0' } } export function compareVersions(leftVersion, rightVersion) { const left = String(leftVersion || '0').replace(/^v/i, '').split('.') const right = String(rightVersion || '0').replace(/^v/i, '').split('.') const length = Math.max(left.length, right.length) for (let index = 0; index < length; index += 1) { const leftPart = Number(left[index] || 0) const rightPart = Number(right[index] || 0) if (leftPart > rightPart) return 1 if (leftPart < rightPart) return -1 } return 0 } export function getReleaseUpdateInfo(release) { const latestVersion = String(release?.tag_name || release?.name || '').replace(/^v/i, '') if (!latestVersion) throw new Error('未获取到有效的版本号') const apkAsset = (release.assets || []).find((asset) => /\.apk(?:\?|$)/i.test(asset.name || asset.browser_download_url || '')) return { latestVersion, apkUrl: apkAsset?.browser_download_url || '', releaseUrl: release.html_url || 'https://gitee.com/li-hua-88/scanapp/releases/latest', updateNote: String(release.body || '修复已知问题并优化使用体验').replace(/\r?\n/g, '\n').trim() } } export function getTodayUpdateCheckKey() { const now = new Date() const year = now.getFullYear() const month = String(now.getMonth() + 1).padStart(2, '0') const day = String(now.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } export function shouldAutoCheckForUpdate() { return uni.getStorageSync(AUTO_UPDATE_CHECK_DATE_KEY) !== getTodayUpdateCheckKey() } export function markAutoUpdateChecked() { uni.setStorageSync(AUTO_UPDATE_CHECK_DATE_KEY, getTodayUpdateCheckKey()) } export function getLatestRelease() { return new Promise((resolve, reject) => { uni.request({ url: GITEE_LATEST_RELEASE_API, method: 'GET', timeout: 15000, header: { Accept: 'application/json' }, success: (res) => { let release = res.data if (typeof release === 'string') { try { release = JSON.parse(release) } catch (error) { release = null } } if (res.statusCode >= 200 && res.statusCode < 300 && release && typeof release === 'object') { resolve(release) return } reject(new Error(`更新服务请求失败(HTTP ${res.statusCode || 0})`)) }, fail: () => reject(new Error('无法连接更新服务,请检查网络后重试')) }) }) }