# 新增提醒功能实现文档 ## 功能概述 基于现有的午餐提醒功能,新增了两个提醒功能: 1. **晚餐提醒**:每天晚上6点提醒用户记录晚餐,点击跳转到营养记录页面 2. **心情提醒**:每天晚上9点提醒用户记录当日心情,点击跳转到心情统计页面 ## 实现细节 ### 1. 通知帮助类扩展 #### 晚餐提醒功能 (`NutritionNotificationHelpers`) 新增方法: - `scheduleDailyDinnerReminder(userName, hour=18, minute=0)`: 注册每日晚餐提醒 - `cancelDinnerReminder()`: 取消晚餐提醒 **特点:** - 默认时间:18:00(晚上6点) - 提醒文案:`🍽️ 晚餐时光到啦!${userName},美好的晚餐时光开始了~记得记录今天的晚餐哦!营养均衡很重要呢 💪` - 跳转链接:`/nutrition/records` - 通知类型:`dinner_reminder` #### 心情提醒功能 (`MoodNotificationHelpers`) 新增类和方法: - `scheduleDailyMoodReminder(userName, hour=21, minute=0)`: 注册每日心情提醒 - `sendMoodReminder(userName)`: 发送即时心情提醒 - `cancelMoodReminder()`: 取消心情提醒 **特点:** - 默认时间:21:00(晚上9点) - 提醒文案:`🌙 今天过得怎么样呀?${userName},夜深了~来记录一下今天的心情吧!每一份情感都值得被珍藏 ✨💕` - 跳转链接:`/mood-statistics` - 通知类型:`mood_reminder` ### 2. 应用启动注册 在 `app/_layout.tsx` 的 `Bootstrapper` 组件中: ```typescript // 当用户数据加载完成且用户名存在时,注册所有提醒 React.useEffect(() => { const registerAllReminders = async () => { if (userDataLoaded && profile?.name) { try { await notificationService.initialize(); // 注册午餐提醒(12:00) await NutritionNotificationHelpers.scheduleDailyLunchReminder(profile.name); // 注册晚餐提醒(18:00) await NutritionNotificationHelpers.scheduleDailyDinnerReminder(profile.name); // 注册心情提醒(21:00) await MoodNotificationHelpers.scheduleDailyMoodReminder(profile.name); console.log('所有提醒已注册'); } catch (error) { console.error('注册提醒失败:', error); } } }; registerAllReminders(); }, [userDataLoaded, profile?.name]); ``` ### 3. 通知点击处理 在 `services/notifications.ts` 中扩展了 `handleNotificationResponse` 方法: ```typescript private handleNotificationResponse(response: Notifications.NotificationResponse): void { const { notification } = response; const data = notification.request.content.data; // ... 其他处理逻辑 if (data?.type === 'dinner_reminder') { // 处理晚餐提醒通知 console.log('用户点击了晚餐提醒通知', data); // 跳转到营养记录页面 if (data?.url) { router.push(data.url as string); } } else if (data?.type === 'mood_reminder') { // 处理心情提醒通知 console.log('用户点击了心情提醒通知', data); // 跳转到心情页面 if (data?.url) { router.push(data.url as string); } } } ``` ### 4. 通知类型扩展 在 `NotificationTypes` 中新增: ```typescript export const NotificationTypes = { // ... 现有类型 DINNER_REMINDER: 'dinner_reminder', MOOD_REMINDER: 'mood_reminder', } as const; ``` ## 用户体验设计 ### 1. 提醒文案设计原则 - **可爱生动**:使用emoji和亲切的语言 - **个性化**:包含用户名称 - **激励性**:鼓励用户养成良好习惯 - **情感化**:让用户感受到关怀 ### 2. 时间安排 - **午餐提醒**:12:00 - 用餐高峰期 - **晚餐提醒**:18:00 - 晚餐准备时间 - **心情提醒**:21:00 - 一天结束,适合反思 ### 3. 跳转逻辑 - **营养提醒**:直接跳转到营养记录页面,方便用户快速记录 - **心情提醒**:跳转到心情统计页面,用户可以查看历史并添加新记录 ## 技术特点 ### 1. 防重复注册 - 每个提醒类型都会检查是否已存在相同的提醒 - 避免重复注册导致的多次通知 ### 2. 错误处理 - 完整的try-catch错误处理 - 详细的日志记录 - 优雅的降级处理 ### 3. 类型安全 - 完整的TypeScript类型定义 - 通知数据结构的类型约束 ### 4. 可扩展性 - 模块化的设计 - 易于添加新的提醒类型 - 统一的接口规范 ## 测试建议 ### 1. 功能测试 - [ ] 验证提醒是否在正确时间触发 - [ ] 测试通知点击跳转是否正确 - [ ] 检查防重复注册机制 - [ ] 验证用户名个性化显示 ### 2. 用户体验测试 - [ ] 提醒文案是否吸引人 - [ ] 跳转页面是否符合预期 - [ ] 通知频率是否合适 - [ ] 整体用户流程是否顺畅 ### 3. 边界情况测试 - [ ] 用户名为空的处理 - [ ] 权限被拒绝的处理 - [ ] 应用被杀死后的提醒恢复 - [ ] 系统时间变更的影响 ## 后续优化建议 1. **个性化时间设置**:允许用户自定义提醒时间 2. **智能提醒**:根据用户习惯调整提醒时间 3. **提醒开关**:允许用户单独控制每种提醒 4. **提醒统计**:记录用户对提醒的响应情况 5. **A/B测试**:测试不同文案的效果 ## 相关文件 - `utils/notificationHelpers.ts` - 提醒功能实现 - `app/_layout.tsx` - 应用启动时的提醒注册 - `services/notifications.ts` - 通知服务和点击处理 - `app/nutrition/records.tsx` - 营养记录页面 - `app/mood-statistics.tsx` - 心情统计页面