137 lines
4.4 KiB
Markdown
137 lines
4.4 KiB
Markdown
# 推送通知用户偏好设置控制实现文档
|
||
|
||
## 概述
|
||
|
||
本次实现为项目的推送通知系统添加了用户偏好设置控制功能。用户现在可以通过个人页面的开关来控制是否接收推送通知,该设置会在底层推送服务中生效。
|
||
|
||
## 实现内容
|
||
|
||
### 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. **性能影响**:每次发送推送前会进行异步检查,但影响微乎其微
|
||
|
||
## 未来扩展
|
||
|
||
可以考虑添加更细粒度的推送控制:
|
||
- 按通知类型分别控制(运动提醒、目标通知等)
|
||
- 时间段控制(勿扰时间)
|
||
- 频率控制(每日最大推送数量)
|
||
|
||
这些功能可以基于当前的架构轻松扩展。 |