- 添加 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>
77 lines
2.1 KiB
TypeScript
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' });
|
|
}
|
|
}
|