Files
plates-server/docs/ios-push-notification-design.md
2025-10-11 17:38:04 +08:00

265 lines
6.9 KiB
Markdown
Raw Permalink 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.

# iOS远程推送功能设计方案
## 1. 技术方案概述
### 1.1 推送服务选择
- **服务提供商**: Apple官方APNs (Apple Push Notification service)
- **Node.js库**: @parse/node-apn (Trust Score: 9.8支持HTTP/2维护良好)
- **认证方式**: Token-based authentication (推荐) 或 Certificate-based authentication
### 1.2 技术架构
```
iOS App -> APNs -> 后端服务器 (NestJS) -> APNs Provider -> iOS设备
```
### 1.3 核心组件
1. **推送令牌管理**: 存储和管理设备推送令牌
2. **APNs服务**: 与Apple推送服务通信
3. **消息模板系统**: 管理推送消息内容
4. **推送日志**: 记录推送状态和结果
5. **API接口**: 提供推送令牌注册和推送发送功能
## 2. 数据库设计
### 2.1 推送令牌表 (t_user_push_tokens)
```sql
CREATE TABLE t_user_push_tokens (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(255) NOT NULL,
device_token VARCHAR(255) NOT NULL,
device_type ENUM('IOS', 'ANDROID') NOT NULL DEFAULT 'IOS',
app_version VARCHAR(50),
os_version VARCHAR(50),
device_name VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
last_used_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_device_token (device_token),
INDEX idx_user_device (user_id, device_token),
UNIQUE KEY uk_user_device_token (user_id, device_token)
);
```
### 2.2 推送消息表 (t_push_messages)
```sql
CREATE TABLE t_push_messages (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
user_id VARCHAR(255) NOT NULL,
device_token VARCHAR(255) NOT NULL,
message_type VARCHAR(50) NOT NULL,
title VARCHAR(255),
body TEXT,
payload JSON,
push_type ENUM('ALERT', 'BACKGROUND', 'VOIP', 'LIVEACTIVITY') DEFAULT 'ALERT',
priority TINYINT DEFAULT 10,
expiry DATETIME,
collapse_id VARCHAR(64),
status ENUM('PENDING', 'SENT', 'FAILED', 'EXPIRED') DEFAULT 'PENDING',
apns_response JSON,
error_message TEXT,
sent_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id),
INDEX idx_status (status),
INDEX idx_created_at (created_at),
INDEX idx_message_type (message_type)
);
```
### 2.3 推送模板表 (t_push_templates)
```sql
CREATE TABLE t_push_templates (
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
template_key VARCHAR(100) NOT NULL UNIQUE,
title VARCHAR(255) NOT NULL,
body TEXT NOT NULL,
payload_template JSON,
push_type ENUM('ALERT', 'BACKGROUND', 'VOIP', 'LIVEACTIVITY') DEFAULT 'ALERT',
priority TINYINT DEFAULT 10,
is_active BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_template_key (template_key),
INDEX idx_is_active (is_active)
);
```
## 3. 服务架构设计
### 3.1 模块结构
```
src/push-notifications/
├── push-notifications.module.ts
├── push-notifications.controller.ts
├── push-notifications.service.ts
├── apns.provider.ts
├── models/
│ ├── user-push-token.model.ts
│ ├── push-message.model.ts
│ └── push-template.model.ts
├── dto/
│ ├── register-device-token.dto.ts
│ ├── send-push-notification.dto.ts
│ ├── push-template.dto.ts
│ └── push-response.dto.ts
└── interfaces/
├── push-notification.interface.ts
└── apns-config.interface.ts
```
### 3.2 核心服务类
1. **PushNotificationsService**: 主要业务逻辑服务
2. **ApnsProvider**: APNs连接和通信服务
3. **PushTokenService**: 推送令牌管理服务
4. **PushTemplateService**: 推送模板管理服务
## 4. API接口设计
### 4.1 推送令牌管理
```
POST /api/push-notifications/register-token
PUT /api/push-notifications/update-token
DELETE /api/push-notifications/unregister-token
```
### 4.2 推送消息发送
```
POST /api/push-notifications/send
POST /api/push-notifications/send-by-template
POST /api/push-notifications/send-batch
```
### 4.3 推送模板管理
```
GET /api/push-notifications/templates
POST /api/push-notifications/templates
PUT /api/push-notifications/templates/:id
DELETE /api/push-notifications/templates/:id
```
## 5. 配置要求
### 5.1 环境变量
```bash
# APNs配置
APNS_KEY_ID=your_key_id
APNS_TEAM_ID=your_team_id
APNS_KEY_PATH=path/to/APNsAuthKey_XXXXXXXXXX.p8
APNS_BUNDLE_ID=com.yourcompany.yourapp
APNS_ENVIRONMENT=production # or sandbox
# 推送服务配置
PUSH_RETRY_LIMIT=3
PUSH_REQUEST_TIMEOUT=5000
PUSH_HEARTBEAT=60000
```
### 5.2 APNs认证配置
- **Token-based认证** (推荐):
- Key ID: 从Apple开发者账号获取
- Team ID: 从Apple开发者账号获取
- 私钥文件: .p8格式的私钥文件
- **Certificate-based认证**:
- 证书文件: .pem格式的证书文件
- 私钥文件: .pem格式的私钥文件
## 6. 推送消息类型
### 6.1 基础推送类型
- **ALERT**: 标准推送通知,显示警告、播放声音或更新应用图标徽章
- **BACKGROUND**: 静默推送,不显示用户界面
- **VOIP**: VoIP推送用于实时通信
- **LIVEACTIVITY**: 实时活动推送
### 6.2 业务场景推送
- 训练提醒
- 饮食记录提醒
- 挑战进度通知
- 会员到期提醒
- 系统通知
## 7. 错误处理和重试机制
### 7.1 常见错误处理
- **Unregistered**: 设备令牌无效,从数据库中删除
- **BadDeviceToken**: 设备令牌格式错误,记录并标记为无效
- **DeviceTokenNotForTopic**: 设备令牌与Bundle ID不匹配
- **TooManyRequests**: 请求频率过高,实现退避重试
- **InternalServerError**: APNs服务器错误实现重试机制
### 7.2 重试策略
- 指数退避算法
- 最大重试次数限制
- 不同错误类型的差异化处理
## 8. 安全考虑
### 8.1 数据安全
- 推送令牌加密存储
- 敏感信息脱敏日志
- API访问权限控制
### 8.2 隐私保护
- 用户推送偏好设置
- 推送内容审核机制
- 推送频率限制
## 9. 监控和日志
### 9.1 推送监控
- 推送成功率统计
- 推送延迟监控
- 错误率分析
### 9.2 日志记录
- 推送请求日志
- APNs响应日志
- 错误详情日志
## 10. 性能优化
### 10.1 连接管理
- HTTP/2连接池
- 连接复用
- 心跳保活
### 10.2 批量处理
- 批量推送优化
- 异步处理机制
- 队列管理
## 11. 测试策略
### 11.1 单元测试
- 服务层逻辑测试
- 数据模型测试
- 工具函数测试
### 11.2 集成测试
- APNs连接测试
- 推送流程测试
- 错误处理测试
### 11.3 端到端测试
- 沙盒环境测试
- 真机推送测试
- 性能压力测试
## 12. 部署和运维
### 12.1 环境配置
- 开发环境: 使用APNs沙盒环境
- 测试环境: 使用APNs沙盒环境
- 生产环境: 使用APNs生产环境
### 12.2 运维监控
- 推送服务健康检查
- 性能指标监控
- 告警机制设置