| | |
| | | import config from "@/config"; |
| | | import { getAllVersion } from "@/api/viewIndex"; |
| | | import bus from "@/plugins/bus"; |
| | | |
| | | function compareVersion(v1, v2) { |
| | | const s1 = String(v1 || "").replace(/[^\d.]/g, "").split(".").map((n) => Number(n) || 0); |
| | |
| | | return `${size}B`; |
| | | } |
| | | |
| | | function getCurrentVersion(logPrefix) { |
| | | async function getCurrentVersion(logPrefix) { |
| | | let currentVersion = config?.appInfo?.version || "1.0.0"; |
| | | console.log(`${logPrefix} 开始获取当前版本,默认值:`, currentVersion); |
| | | // #ifdef MP-WEIXIN |
| | |
| | | // #endif |
| | | // #ifdef APP-PLUS |
| | | try { |
| | | // APP-PLUS 下,plus.runtime.version 不是业务版本号(经常是运行时/SDK版本), |
| | | // 这里改用 getProperty 取系统层面的 app version。 |
| | | // @ts-ignore |
| | | if (plus?.runtime?.version) { |
| | | if (plus?.runtime?.getProperty) { |
| | | // @ts-ignore |
| | | currentVersion = plus.runtime.version; |
| | | const appid = plus.runtime.appid; |
| | | const appInfo = await new Promise((resolve) => { |
| | | // @ts-ignore |
| | | plus.runtime.getProperty(appid, (info) => resolve(info || {})); |
| | | }); |
| | | const v = appInfo?.version || appInfo?.versionName || appInfo?.appVersion || ""; |
| | | if (v) { |
| | | currentVersion = String(v); |
| | | console.log(`${logPrefix} 当前环境=APP-PLUS,版本=`, currentVersion); |
| | | return currentVersion; |
| | | } |
| | | console.log(`${logPrefix} APP-PLUS 获取到的版本字段为空,将使用配置版本:`, currentVersion); |
| | | } |
| | | } catch (e) { |
| | | console.log(`${logPrefix} APP-PLUS 获取版本失败:`, e); |
| | |
| | | // #endif |
| | | } |
| | | |
| | | function downloadVersionPackage(url, logPrefix) { |
| | | console.log(`${logPrefix} 开始下载更新包:`, url); |
| | | uni.showLoading({ title: "更新包下载中..." }); |
| | | uni.downloadFile({ |
| | | url, |
| | | function buildFullDownloadUrl(rawUrl) { |
| | | const u = String(rawUrl || "").trim(); |
| | | if (!u) return ""; |
| | | // 已经是绝对地址,直接返回 |
| | | if (/^https?:\/\//i.test(u)) return u; |
| | | const base = String(config?.fileUrl || config?.baseUrl || "").replace(/\/+$/, ""); |
| | | const path = u.startsWith("/") ? u : `/${u}`; |
| | | return `${base}${path}`; |
| | | } |
| | | |
| | | function emitDownloadProgress(payload, logPrefix) { |
| | | try { |
| | | bus.$emit("versionUpgrade:downloadProgress", payload); |
| | | } catch (e) { |
| | | console.log(`${logPrefix} downloadProgress 事件派发失败:`, e); |
| | | } |
| | | } |
| | | |
| | | function downloadVersionPackage(url, logPrefix, fileSize) { |
| | | const fullUrl = buildFullDownloadUrl(url); |
| | | console.log(`${logPrefix} 开始下载更新包:`, { rawUrl: url, fullUrl }); |
| | | if (!fullUrl) { |
| | | uni.showToast({ title: "更新附件地址无效", icon: "none" }); |
| | | return; |
| | | } |
| | | const totalSize = Number(fileSize); |
| | | const hasTotalSize = Number.isFinite(totalSize) && totalSize > 0; |
| | | console.log(`${logPrefix} 下载大小信息:`, { fileSize, totalSize, hasTotalSize }); |
| | | emitDownloadProgress({ show: true, progress: 0, title: "更新包下载中..." }, logPrefix); |
| | | const task = uni.downloadFile({ |
| | | url: fullUrl, |
| | | success: (res) => { |
| | | console.log(`${logPrefix} 下载结果:`, res); |
| | | uni.hideLoading(); |
| | | emitDownloadProgress({ show: false }, logPrefix); |
| | | if (res.statusCode !== 200 || !res.tempFilePath) { |
| | | console.log(`${logPrefix} 下载失败,状态码或临时路径异常`); |
| | | uni.showToast({ title: "下载失败,请稍后重试", icon: "none" }); |
| | | return; |
| | | } |
| | | const lowerUrl = String(url || "").toLowerCase(); |
| | | const lowerUrl = String(fullUrl || "").toLowerCase(); |
| | | const isInstallPkg = lowerUrl.endsWith(".wgt") || lowerUrl.endsWith(".wgtu") || lowerUrl.endsWith(".apk"); |
| | | console.log(`${logPrefix} 文件类型判断:`, { lowerUrl, isInstallPkg }); |
| | | if (isInstallPkg) { |
| | |
| | | }, |
| | | fail: (err) => { |
| | | console.log(`${logPrefix} 下载请求失败:`, err); |
| | | uni.hideLoading(); |
| | | emitDownloadProgress({ show: false }, logPrefix); |
| | | uni.showToast({ title: "下载失败,请检查网络", icon: "none" }); |
| | | }, |
| | | }); |
| | | |
| | | // 下载进度:部分端(APP/小程序)支持 onProgressUpdate |
| | | try { |
| | | if (task && typeof task.onProgressUpdate === "function") { |
| | | task.onProgressUpdate((p) => { |
| | | const downloadedSize = Number(p?.totalBytesWritten ?? p?.writtenBytes ?? p?.downloadedSize); |
| | | const expectedSize = Number(p?.totalBytesExpectedToWrite ?? p?.totalBytesExpected ?? p?.totalSize); |
| | | const denom = hasTotalSize ? totalSize : (Number.isFinite(expectedSize) && expectedSize > 0 ? expectedSize : 0); |
| | | |
| | | let progress = Number(p?.progress); |
| | | if (!(Number.isFinite(progress) && progress >= 0 && progress <= 100) && denom > 0 && Number.isFinite(downloadedSize) && downloadedSize >= 0) { |
| | | progress = (downloadedSize / denom) * 100; |
| | | } |
| | | if (!Number.isFinite(progress)) return; |
| | | |
| | | emitDownloadProgress({ show: true, progress, title: "更新包下载中..." }, logPrefix); |
| | | }); |
| | | } |
| | | } catch (e) { |
| | | console.log(`${logPrefix} onProgressUpdate 绑定失败:`, e); |
| | | } |
| | | } |
| | | |
| | | async function checkAppVersionUpgrade(logPrefix, currentVersion) { |
| | |
| | | return; |
| | | } |
| | | const firstFile = Array.isArray(first?.commonFileList) ? first.commonFileList[0] : null; |
| | | const downloadUrl = firstFile?.url || ""; |
| | | const downloadUrl = firstFile?.url || firstFile?.downloadUrl || ""; |
| | | const fileSizeText = formatFileSize(firstFile?.fileSize); |
| | | console.log(`${logPrefix} 更新附件信息:`, { |
| | | downloadUrl, |
| | |
| | | uni.showToast({ title: "未找到更新附件地址", icon: "none" }); |
| | | return; |
| | | } |
| | | downloadVersionPackage(downloadUrl, logPrefix); |
| | | downloadVersionPackage(downloadUrl, logPrefix, firstFile?.fileSize); |
| | | }, |
| | | }); |
| | | } catch (e) { |
| | |
| | | const logPrefix = options.logPrefix || "[version]"; |
| | | let lastVersionCheckAt = 0; |
| | | |
| | | const triggerVersionCheck = (from = "unknown") => { |
| | | const triggerVersionCheck = async (from = "unknown") => { |
| | | const now = Date.now(); |
| | | if (now - lastVersionCheckAt < throttleMs) { |
| | | console.log(`${logPrefix} 跳过重复检查,来源=${from}`); |
| | |
| | | } |
| | | lastVersionCheckAt = now; |
| | | console.log(`${logPrefix} 触发版本检查,来源=${from}`); |
| | | const currentVersion = getCurrentVersion(logPrefix); |
| | | checkAppVersionUpgrade(logPrefix, currentVersion); |
| | | const currentVersion = await getCurrentVersion(logPrefix); |
| | | await checkAppVersionUpgrade(logPrefix, currentVersion); |
| | | }; |
| | | |
| | | return { triggerVersionCheck }; |