feat: 添加版本检查 API,支持从 Cloudflare Function 获取应用版本信息;更新相关配置文件
This commit is contained in:
@@ -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}¤tVersion=${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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user