qia-client/public/sw-register.ts
ddshi 2feb02becf feat: 实现浏览器通知提醒功能
- 添加 Service Worker 支持后台定时检查提醒
- 实现浏览器通知 API 集成
- 添加设置页面通知开关和测试功能
- 创建同步服务自动将提醒同步到 SW
- 优化提醒检查逻辑(30秒间隔,10分钟宽限期)

文件变更:
- public/sw.js: Service Worker 主文件
- public/sw-register.ts: SW 注册脚本
- public/manifest.json: PWA 清单文件
- src/services/notification.ts: 通知权限管理
- src/services/swSync.ts: 提醒同步服务
- src/stores/index.ts: 添加同步调用
- src/pages/SettingsPage.tsx: 添加通知开关和测试按钮

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 14:42:36 +08:00

77 lines
2.1 KiB
TypeScript

// Service Worker 注册与生命周期管理
export async function registerServiceWorker(): Promise<ServiceWorkerRegistration | null> {
if (!('serviceWorker' in navigator)) {
console.warn('Service Worker 不支持');
return null;
}
try {
const registration = await navigator.serviceWorker.register('/sw.js', {
scope: '/',
});
console.log('SW 注册成功:', registration.scope);
// 检查更新
registration.addEventListener('updatefound', () => {
const newWorker = registration.installing;
if (newWorker) {
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
// 新版本可用,通知用户刷新
console.log('新版本 Service Worker 可用');
}
});
}
});
return registration;
} catch (error) {
console.error('SW 注册失败:', error);
return null;
}
}
export async function unregisterServiceWorker(): Promise<boolean> {
if (!('serviceWorker' in navigator)) return false;
try {
const registration = await navigator.serviceWorker.ready;
return registration.unregister();
} catch (error) {
console.error('SW 注销失败:', error);
return false;
}
}
export async function startPeriodicSync(): Promise<void> {
// 发送消息启动定时检查
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage({ type: 'START_CHECK' });
}
}
export async function stopPeriodicSync(): Promise<void> {
// 发送消息停止定时检查
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage({ type: 'STOP_CHECK' });
}
}
export async function sendEventsToSW(events: any[]): Promise<void> {
if (!navigator.serviceWorker.controller) return;
navigator.serviceWorker.controller.postMessage({
type: 'UPDATE_EVENTS',
events,
});
}
export async function skipWaiting(): Promise<void> {
const registration = await navigator.serviceWorker.getRegistration();
if (registration?.waiting) {
registration.waiting.postMessage({ type: 'SKIP_WAITING' });
}
}