171 lines
5.6 KiB
Markdown
171 lines
5.6 KiB
Markdown
# 锻炼结束监听和推送通知功能
|
||
|
||
## 功能概述
|
||
|
||
这个功能实现了在 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)
|
||
- **锻炼类型筛选**: 允许用户选择关心的锻炼类型
|
||
- **通知频率控制**: 避免短时间内重复通知
|
||
|
||
## 使用方法
|
||
|
||
### 用户设置
|
||
1. 打开应用
|
||
2. 进入设置页面(可通过锻炼历史页面访问)
|
||
3. 配置锻炼通知偏好:
|
||
- 启用/禁用功能
|
||
- 设置通知时间范围
|
||
- 选择要接收通知的锻炼类型
|
||
|
||
### 开发者测试
|
||
```typescript
|
||
import { WorkoutTestHelper } from '@/utils/workoutTestHelper';
|
||
|
||
// 测试通知功能
|
||
await WorkoutTestHelper.testWorkoutNotifications();
|
||
|
||
// 测试偏好设置
|
||
await WorkoutTestHelper.testPreferences();
|
||
|
||
// 模拟锻炼完成
|
||
await WorkoutTestHelper.simulateWorkoutCompletion();
|
||
|
||
// 运行完整测试套件
|
||
await WorkoutTestHelper.runFullTestSuite();
|
||
```
|
||
|
||
## 权限要求
|
||
|
||
### iOS 权限
|
||
1. **HealthKit 权限**: 需要读取锻炼数据
|
||
2. **通知权限**: 需要发送推送通知
|
||
3. **后台执行权限**: 需要在后台监听数据变化
|
||
|
||
### 配置文件
|
||
在 `app.json` 中已配置必要的后台模式:
|
||
```json
|
||
"UIBackgroundModes": [
|
||
"processing",
|
||
"fetch",
|
||
"remote-notification"
|
||
]
|
||
```
|
||
|
||
## 技术细节
|
||
|
||
### 防抖处理
|
||
- 使用 5 秒延迟避免短时间内重复处理
|
||
- 确保 HealthKit 数据完全更新后再处理
|
||
|
||
### 错误处理
|
||
- 完善的错误捕获和日志记录
|
||
- 权限检查和用户友好提示
|
||
|
||
### 性能优化
|
||
- 使用 HealthKit 原生后台查询,最小化电池消耗
|
||
- 智能判断锻炼结束时机,避免频繁查询
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **通知未发送**
|
||
- 检查通知权限是否已授予
|
||
- 检查锻炼通知是否在设置中启用
|
||
- 检查当前时间是否在允许的时间范围内
|
||
|
||
2. **监听不工作**
|
||
- 确保 HealthKit 权限已授予
|
||
- 检查应用是否有后台执行权限
|
||
- 重启应用重新初始化监听服务
|
||
|
||
3. **重复通知**
|
||
- 系统有防重复机制,记录已处理的锻炼ID
|
||
- 如果出现问题,可以清除应用数据重新开始
|
||
|
||
### 调试方法
|
||
1. 使用 `WorkoutTestHelper` 进行测试
|
||
2. 查看控制台日志了解详细执行过程
|
||
3. 检查 iOS 设备的设置中的通知权限
|
||
|
||
## 未来扩展
|
||
|
||
1. **更多锻炼类型支持**: 添加更多运动类型的个性化消息
|
||
2. **成就系统**: 基于锻炼历史生成成就和里程碑
|
||
3. **社交分享**: 允许用户分享锻炼成就
|
||
4. **智能建议**: 基于锻炼数据提供个性化建议
|
||
|
||
## 注意事项
|
||
|
||
1. **电池使用**: 虽然使用了优化的后台查询,但仍会消耗一定电量
|
||
2. **隐私保护**: 所有数据仅在本地处理,不会上传到服务器
|
||
3. **兼容性**: 仅支持 iOS,需要 iOS 16.0+
|
||
4. **测试环境**: 在模拟器上可能无法完全测试,建议使用真机
|
||
|
||
## 更新日志
|
||
|
||
### v1.0.0
|
||
- 初始版本发布
|
||
- 支持基本的锻炼结束监听和通知
|
||
- 完整的用户偏好设置
|
||
- 测试工具和文档 |