Files
digital-pilates/docs/notification-user-preference-implementation.md

137 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 推送通知用户偏好设置控制实现文档
## 概述
本次实现为项目的推送通知系统添加了用户偏好设置控制功能。用户现在可以通过个人页面的开关来控制是否接收推送通知,该设置会在底层推送服务中生效。
## 实现内容
### 1. 用户偏好设置扩展 (`utils/userPreferences.ts`)
新增了以下功能:
- **接口扩展**:在 `UserPreferences` 接口中添加了 `notificationEnabled: boolean` 字段
- **存储键**:添加了 `NOTIFICATION_ENABLED` 存储键
- **默认值**:推送通知默认开启 (`true`)
- **新增方法**
- `setNotificationEnabled(enabled: boolean)`: 设置推送开关状态
- `getNotificationEnabled()`: 获取推送开关状态
- 更新了 `resetUserPreferences()` 以包含推送设置
### 2. 推送服务核心控制 (`services/notifications.ts`)
`NotificationService` 类中添加了用户偏好检查机制:
- **新增方法**`isNotificationAllowed()` - 检查用户是否允许推送通知
- **双重检查**
1. 检查用户偏好设置中的推送开关
2. 检查系统推送权限状态
- **统一拦截**:在 `scheduleLocalNotification()` 方法中统一检查,确保所有推送都受控制
### 3. 个人页面开关同步 (`app/(tabs)/personal.tsx`)
更新了个人页面的推送开关逻辑:
- **状态同步**:开关状态与用户偏好设置保持同步
- **页面加载**:页面聚焦时自动加载用户推送偏好设置
- **开关处理**
- 开启时:先检查系统权限,成功后保存用户偏好
- 关闭时:直接保存用户偏好设置
- **错误处理**:提供友好的错误提示和引导
## 工作流程
```
用户操作推送开关
检查系统推送权限 (仅开启时)
保存用户偏好设置
底层推送服务检查
发送/阻止推送通知
```
## 使用方式
### 1. 用户操作
用户可以在个人页面的"通知"部分找到"消息推送"开关:
- 开启:需要系统权限,成功后会发送测试通知
- 关闭:立即生效,不会收到任何推送通知
### 2. 开发者使用
所有现有的推送通知方法都会自动受到用户偏好设置控制:
```typescript
// 这些方法都会自动检查用户偏好设置
await notificationService.sendImmediateNotification(notification);
await WorkoutNotificationHelpers.sendWorkoutStartReminder(userName);
await GoalNotificationHelpers.sendGoalAchievementNotification(userName, goalName);
```
### 3. 测试功能
提供了完整的测试工具 (`utils/notificationTest.ts`)
```typescript
import { NotificationTestHelpers } from '@/utils/notificationTest';
// 测试用户偏好设置控制
await NotificationTestHelpers.testUserPreferenceControl();
// 测试权限状态
await NotificationTestHelpers.testPermissionStatus();
// 测试不同类型的通知
await NotificationTestHelpers.testDifferentNotificationTypes();
```
## 技术特点
### 1. 双重保护机制
- **用户偏好层**:用户主动控制是否接收推送
- **系统权限层**:系统级别的推送权限控制
### 2. 统一拦截点
- 所有推送通知都通过 `NotificationService.scheduleLocalNotification()` 方法
- 在此方法中统一检查用户偏好和系统权限
- 确保没有推送能绕过用户设置
### 3. 状态同步
- 个人页面开关与用户偏好设置实时同步
- 页面聚焦时自动刷新状态
- 避免状态不一致问题
### 4. 向后兼容
- 不影响现有推送通知代码
- 所有现有方法自动获得用户偏好控制功能
- 默认开启推送,保持原有用户体验
## 日志和调试
系统会在控制台输出相关日志:
```
用户已在偏好设置中关闭推送通知
推送通知被用户偏好设置或系统权限阻止,跳过发送
本地通知已安排ID: notification-id-123
```
## 注意事项
1. **权限优先级**:即使用户开启了偏好设置,如果系统权限被拒绝,推送仍然无法发送
2. **测试通知**:用户开启推送时会发送一条测试通知,确认功能正常
3. **错误处理**:所有操作都有完善的错误处理和用户提示
4. **性能影响**:每次发送推送前会进行异步检查,但影响微乎其微
## 未来扩展
可以考虑添加更细粒度的推送控制:
- 按通知类型分别控制(运动提醒、目标通知等)
- 时间段控制(勿扰时间)
- 频率控制(每日最大推送数量)
这些功能可以基于当前的架构轻松扩展。