diff --git a/resources/icon-192.png b/resources/icon-192.png new file mode 100644 index 0000000..655b190 Binary files /dev/null and b/resources/icon-192.png differ diff --git a/resources/icon-512-maskable.png b/resources/icon-512-maskable.png new file mode 100644 index 0000000..cf96133 Binary files /dev/null and b/resources/icon-512-maskable.png differ diff --git a/resources/icon-512.png b/resources/icon-512.png new file mode 100644 index 0000000..dc8da0b Binary files /dev/null and b/resources/icon-512.png differ diff --git a/resources/manifest.json b/resources/manifest.json index f04dc25..8de457c 100644 --- a/resources/manifest.json +++ b/resources/manifest.json @@ -8,9 +8,20 @@ "theme_color": "#000000", "icons": [ { - "src": "./icon.png", + "src": "/icon-192.png", "type": "image/png", - "sizes": "256x256" + "sizes": "192x192" + }, + { + "src": "/icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "/icon-512-maskable.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" } ] } diff --git a/resources/sw.js b/resources/sw.js new file mode 100644 index 0000000..d752f1f --- /dev/null +++ b/resources/sw.js @@ -0,0 +1,13 @@ +// 最小 Service Worker:仅满足 PWA 可安装性要求(需存在 fetch 处理器)。 +// 不做任何缓存拦截,所有请求保持浏览器默认网络行为。 +self.addEventListener('install', () => { + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('fetch', () => { + // 特意留空:不拦截,默认走网络 +}); diff --git a/src/renderer/main.ts b/src/renderer/main.ts index bbfd0b6..8aaa882 100644 --- a/src/renderer/main.ts +++ b/src/renderer/main.ts @@ -8,10 +8,20 @@ import { createApp } from 'vue'; import i18n from '@/../i18n/renderer'; import router from '@/router'; import pinia from '@/store'; +import { isElectron } from '@/utils'; import App from './App.vue'; import directives from './directive'; +// Web 端注册最小 Service Worker,使站点满足 PWA 可安装条件(#640/#382) +if (!isElectron && import.meta.env.PROD && 'serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('/sw.js').catch((error) => { + console.warn('[PWA] Service Worker 注册失败:', error); + }); + }); +} + const app = createApp(App); Object.keys(directives).forEach((key: string) => {