feat: 添加版本检查 API,支持从 Cloudflare Function 获取应用版本信息;更新相关配置文件

This commit is contained in:
2026-01-14 02:38:02 +07:00
parent a64bd9b470
commit 26ba611095
8 changed files with 285 additions and 103 deletions

View File

@@ -1,7 +1,6 @@
import type { VersionInfo } from "@/api/types";
import { App } from "@capacitor/app";
import { alertController } from "@ionic/vue";
import { client } from "@/api";
import { i18n } from "@/locales";
/**
@@ -28,12 +27,6 @@ function compareVersion(version1: string, version2: string): number {
return 0;
}
const updateUrls = {
ios: "https://apps.apple.com/app/id123456789",
android: "https://play.google.com/store/apps/details?id=riwa.ionic.app",
browser: "",
} as const;
/**
* 应用更新检查
*/
@@ -81,40 +74,53 @@ export function useAppUpdate() {
updateUrl?: string;
}> {
state.isChecking = true;
if (import.meta.env.DEV) {
const current = await getCurrentVersion();
// 开发环境下不检查更新
state.currentVersion = current;
state.hasUpdate = false;
state.latestVersion = current;
state.forceUpdate = false;
state.updateMessage = "";
state.updateUrl = "";
state.isChecking = false;
return {
hasUpdate: false,
currentVersion: current,
};
}
try {
// 1. 获取当前版本
const current = await getCurrentVersion();
state.currentVersion = current;
// 2. 从服务器检查最新版本
// TODO: 后端接口实现后替换为真实 API 调用
// const response = await client.api.app.version.get({
// query: {
// platform: platform === 'ios' ? 'ios' : platform === 'android' ? 'android' : 'web',
// currentVersion: current,
// },
// })
// 模拟后端返回数据(开发阶段)
await new Promise(resolve => setTimeout(resolve, 500));
const versionInfo: VersionInfo = {
version: "0.0.1", // 模拟有新版本
forceUpdate: false,
updateMessage: "修复了一些问题并优化了性能",
updateUrl: updateUrls[platform] || "",
minSupportVersion: "0.0.1",
};
// 2. PWA 应用检查 Service Worker 更新
if (platform === "browser" && "serviceWorker" in navigator) {
const registration = await navigator.serviceWorker.getRegistration();
if (registration) {
// 触发 Service Worker 更新检查
await registration.update();
}
}
// 真实 API 调用后的逻辑
// if (response.error) {
// console.error('检查更新失败:', response.error)
// return {
// hasUpdate: false,
// currentVersion: current,
// }
// }
// const versionInfo = response.data as VersionInfo
// 3. 从 Cloudflare Function 检查最新版本
const apiUrl = window.location.origin;
const response = await fetch(
`${apiUrl}/api/version?platform=${platform}&currentVersion=${current}`,
{ cache: "no-cache" }, // 不使用缓存,确保获取最新版本信息
);
// 3. 版本比较
if (!response.ok) {
console.error("检查更新失败:", response.statusText);
return {
hasUpdate: false,
currentVersion: current,
};
}
const versionInfo: VersionInfo = await response.json();
// 4. 版本比较
const isNewVersion = compareVersion(current, versionInfo.version) < 0;
// 更新状态
@@ -186,7 +192,7 @@ export function useAppUpdate() {
text: i18n.global.t("app.update.now"),
role: "confirm",
handler: () => {
openStoreUpdate();
applyUpdate();
},
},
]
@@ -199,7 +205,7 @@ export function useAppUpdate() {
text: i18n.global.t("app.update.now"),
role: "confirm",
handler: () => {
openStoreUpdate();
applyUpdate();
},
},
],
@@ -218,22 +224,63 @@ export function useAppUpdate() {
return;
}
// Web 应用检查 Service Worker 更新
if ("serviceWorker" in navigator) {
// PWA 应用更新流程
if (platform === "browser" && "serviceWorker" in navigator) {
const registration = await navigator.serviceWorker.getRegistration();
if (registration?.waiting) {
// 通知 Service Worker 跳过等待,立即激活
registration.waiting.postMessage({ type: "SKIP_WAITING" });
// 等待 Service Worker 激活后重新加载页面
navigator.serviceWorker.addEventListener("controllerchange", () => {
window.location.reload();
});
return;
if (registration) {
// 检查是否有等待激活的 Service Worker
const waitingWorker = registration.waiting;
if (waitingWorker) {
// 通知 Service Worker 跳过等待,立即激活
(waitingWorker as ServiceWorker).postMessage({ type: "SKIP_WAITING" });
// 等待控制器变更后重新加载
navigator.serviceWorker.addEventListener("controllerchange", () => {
window.location.reload();
}, { once: true });
return;
}
// 检查是否有正在安装的 Service Worker
if (registration.installing) {
const installingWorker = registration.installing;
installingWorker.addEventListener("statechange", () => {
if (installingWorker.state === "installed" && navigator.serviceWorker.controller) {
// 新的 Service Worker 已安装,通知它跳过等待
(installingWorker as ServiceWorker).postMessage({ type: "SKIP_WAITING" });
navigator.serviceWorker.addEventListener("controllerchange", () => {
window.location.reload();
}, { once: true });
}
});
return;
}
// 手动触发更新检查
try {
await registration.update();
// 等待一小段时间让更新完成
await new Promise(resolve => setTimeout(resolve, 1000));
// 如果有等待的 Service Worker激活它
const waitingWorker = registration.waiting;
if (waitingWorker) {
(waitingWorker as ServiceWorker).postMessage({ type: "SKIP_WAITING" });
navigator.serviceWorker.addEventListener("controllerchange", () => {
window.location.reload();
}, { once: true });
return;
}
}
catch (error) {
console.error("Service Worker 更新失败:", error);
}
}
}
// 如果没有 Service Worker,直接重新加载
// 如果以上都没有执行,直接重新加载页面
window.location.reload();
}