5.6 KiB
5.6 KiB
锻炼结束监听和推送通知功能
功能概述
这个功能实现了在 iOS 设备上监听用户锻炼结束事件,并在锻炼完成后自动发送个性化的鼓励推送通知。当用户完成锻炼(如跑步30分钟)时,系统会自动获取锻炼数据并分析,然后发送包含锻炼详情的鼓励消息。
技术架构
iOS 原生层
- HKObserverQuery: 使用 HealthKit 的观察者查询监听锻炼数据变化
- 后台执行: 配置应用在后台执行查询的能力
- 事件桥接: 通过 React Native 桥接将原生事件传递到 JS 层
JavaScript 服务层
- WorkoutMonitorService: 锻炼监听服务,处理原生事件
- WorkoutNotificationService: 锻炼通知服务,分析和发送通知
- WorkoutPreferences: 用户偏好设置管理
通知系统
- 个性化内容: 基于锻炼类型、持续时间、消耗卡路里等生成定制消息
- 智能时机: 避免深夜打扰,尊重用户偏好设置
- 用户控制: 完整的开关和类型筛选功能
文件结构
ios/OutLive/
├── HealthKitManager.swift # iOS 原生 HealthKit 管理器(已扩展)
├── HealthKitManager.m # Objective-C 桥接文件(已扩展)
services/
├── workoutMonitor.ts # 锻炼监听服务
├── workoutNotificationService.ts # 锻炼通知服务
└── notifications.ts # 通知服务(已扩展)
utils/
├── workoutPreferences.ts # 锻炼通知偏好设置
└── workoutTestHelper.ts # 测试工具
app/workout/
└── notification-settings.tsx # 通知设置页面
app/_layout.tsx # 应用入口(已集成)
功能特性
1. 实时监听
- 使用
HKObserverQuery实现真正的实时监听 - 当 HealthKit 中有新的锻炼数据时立即触发
- 支持后台执行,即使应用在后台也能监听
2. 智能分析
- 复用现有的锻炼数据分析功能
- 支持心率区间分析、METs 计算、强度评估
- 基于锻炼类型生成个性化鼓励内容
3. 个性化通知
不同锻炼类型的专属消息:
- 跑步: "🏃♂️ 跑步完成!太棒了!您刚刚完成了30分钟的跑步,消耗了约250千卡热量。平均心率140次/分。坚持运动让身体更健康!💪"
- 瑜伽: "🧘♀️ 瑜伽完成!45分钟的瑜伽练习完成!提升了柔韧性和内心平静。继续保持这份宁静!🌸"
- HIIT: "🔥 HIIT训练完成!高强度间歇训练20分钟完成!消耗了约200千卡热量。心肺功能得到有效提升,您的努力值得称赞!⚡"
4. 用户控制
- 功能开关: 允许用户启用/禁用锻炼结束通知
- 时间段设置: 限制通知发送时间(如 8:00-22:00)
- 锻炼类型筛选: 允许用户选择关心的锻炼类型
- 通知频率控制: 避免短时间内重复通知
使用方法
用户设置
- 打开应用
- 进入设置页面(可通过锻炼历史页面访问)
- 配置锻炼通知偏好:
- 启用/禁用功能
- 设置通知时间范围
- 选择要接收通知的锻炼类型
开发者测试
import { WorkoutTestHelper } from '@/utils/workoutTestHelper';
// 测试通知功能
await WorkoutTestHelper.testWorkoutNotifications();
// 测试偏好设置
await WorkoutTestHelper.testPreferences();
// 模拟锻炼完成
await WorkoutTestHelper.simulateWorkoutCompletion();
// 运行完整测试套件
await WorkoutTestHelper.runFullTestSuite();
权限要求
iOS 权限
- HealthKit 权限: 需要读取锻炼数据
- 通知权限: 需要发送推送通知
- 后台执行权限: 需要在后台监听数据变化
配置文件
在 app.json 中已配置必要的后台模式:
"UIBackgroundModes": [
"processing",
"fetch",
"remote-notification"
]
技术细节
防抖处理
- 使用 5 秒延迟避免短时间内重复处理
- 确保 HealthKit 数据完全更新后再处理
错误处理
- 完善的错误捕获和日志记录
- 权限检查和用户友好提示
性能优化
- 使用 HealthKit 原生后台查询,最小化电池消耗
- 智能判断锻炼结束时机,避免频繁查询
故障排除
常见问题
-
通知未发送
- 检查通知权限是否已授予
- 检查锻炼通知是否在设置中启用
- 检查当前时间是否在允许的时间范围内
-
监听不工作
- 确保 HealthKit 权限已授予
- 检查应用是否有后台执行权限
- 重启应用重新初始化监听服务
-
重复通知
- 系统有防重复机制,记录已处理的锻炼ID
- 如果出现问题,可以清除应用数据重新开始
调试方法
- 使用
WorkoutTestHelper进行测试 - 查看控制台日志了解详细执行过程
- 检查 iOS 设备的设置中的通知权限
未来扩展
- 更多锻炼类型支持: 添加更多运动类型的个性化消息
- 成就系统: 基于锻炼历史生成成就和里程碑
- 社交分享: 允许用户分享锻炼成就
- 智能建议: 基于锻炼数据提供个性化建议
注意事项
- 电池使用: 虽然使用了优化的后台查询,但仍会消耗一定电量
- 隐私保护: 所有数据仅在本地处理,不会上传到服务器
- 兼容性: 仅支持 iOS,需要 iOS 16.0+
- 测试环境: 在模拟器上可能无法完全测试,建议使用真机
更新日志
v1.0.0
- 初始版本发布
- 支持基本的锻炼结束监听和通知
- 完整的用户偏好设置
- 测试工具和文档