- 新增晚餐提醒(18:00)和心情提醒(21:00)的定时通知 - 实现基于HRV数据的压力检测和智能鼓励通知 - 添加后台任务处理支持,修改iOS后台模式为processing - 优化营养记录页面使用Redux状态管理,支持实时数据更新 - 重构卡路里计算公式,移除目标卡路里概念,改为基代+运动-饮食 - 新增营养目标动态计算功能,基于用户身体数据智能推荐 - 完善通知点击跳转逻辑,支持多种提醒类型的路由处理
5.4 KiB
5.4 KiB
新增提醒功能实现文档
功能概述
基于现有的午餐提醒功能,新增了两个提醒功能:
- 晚餐提醒:每天晚上6点提醒用户记录晚餐,点击跳转到营养记录页面
- 心情提醒:每天晚上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 组件中:
// 当用户数据加载完成且用户名存在时,注册所有提醒
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 方法:
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 中新增:
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. 边界情况测试
- 用户名为空的处理
- 权限被拒绝的处理
- 应用被杀死后的提醒恢复
- 系统时间变更的影响
后续优化建议
- 个性化时间设置:允许用户自定义提醒时间
- 智能提醒:根据用户习惯调整提醒时间
- 提醒开关:允许用户单独控制每种提醒
- 提醒统计:记录用户对提醒的响应情况
- A/B测试:测试不同文案的效果
相关文件
utils/notificationHelpers.ts- 提醒功能实现app/_layout.tsx- 应用启动时的提醒注册services/notifications.ts- 通知服务和点击处理app/nutrition/records.tsx- 营养记录页面app/mood-statistics.tsx- 心情统计页面