354 lines
12 KiB
Plaintext
354 lines
12 KiB
Plaintext
================================================================================
|
||
Honor 推送测试详细流程说明文档
|
||
================================================================================
|
||
|
||
一、整体架构
|
||
================================================================================
|
||
|
||
推送测试系统采用分层架构,从测试脚本到最终手机接收,经过以下层次:
|
||
|
||
Python测试脚本 → 推送服务(Java Spring Boot) → Honor推送API → Honor服务器 → 手机设备
|
||
|
||
--------------------------------------------------------------------------------
|
||
层次说明:
|
||
1. 测试脚本层:使用Python构建推送消息并发送HTTP请求
|
||
2. 推送服务层:Java Spring Boot服务,接收请求并路由到对应厂商
|
||
3. Honor推送层:处理Honor特定的推送逻辑
|
||
4. Honor API层:调用Honor官方推送接口
|
||
5. 设备层:手机接收推送通知
|
||
--------------------------------------------------------------------------------
|
||
|
||
|
||
二、详细流程步骤
|
||
================================================================================
|
||
|
||
【步骤1】Python测试脚本构建推送消息
|
||
--------------------------------------------------------------------------------
|
||
文件:test_honor_push.py
|
||
|
||
1.1 定义关键参数:
|
||
- 推送服务地址:http://localhost:8080/android/push
|
||
- 设备Token:BAEAAAAAB.josybFY8YYNOK7suCSammWuFIaIUgCdo1d5Ud2NBTUWnyy2a8yUG2WpwNiTZFgBW3sRPO_q-a1bWjwu_ODI6HWHHszoUi1HbhlhMaxjHmOs-zxfg--SECc
|
||
- 推送类型:8 (ANDROID_PUSH_TYPE_HONOR)
|
||
- 消息类型:0 (普通消息)
|
||
|
||
1.2 构建推送消息JSON对象,包含以下字段:
|
||
{
|
||
"sender": "test_sender_001", // 发送者ID
|
||
"senderName": "测试用户", // 发送者名称
|
||
"target": "honor_device_001", // 接收者ID
|
||
"pushType": 8, // Honor推送类型
|
||
"pushContent": "推送内容", // 推送消息内容
|
||
"deviceToken": "设备Token", // 设备唯一标识
|
||
"packageName": "com.xunpaisoft.social.im", // 应用包名
|
||
"serverTime": 时间戳(毫秒), // 服务器时间
|
||
... 其他字段
|
||
}
|
||
|
||
1.3 发送HTTP POST请求:
|
||
- URL: http://localhost:8080/android/push
|
||
- Content-Type: application/json;charset=UTF-8
|
||
- Body: 上述JSON对象
|
||
|
||
|
||
【步骤2】推送服务接收请求
|
||
--------------------------------------------------------------------------------
|
||
文件:PushController.java
|
||
路径:/android/push
|
||
|
||
2.1 Spring Boot接收HTTP POST请求
|
||
2.2 使用@RequestBody自动将JSON反序列化为PushMessage对象
|
||
2.3 调用AndroidPushService.push()方法
|
||
|
||
|
||
【步骤3】推送服务路由处理
|
||
--------------------------------------------------------------------------------
|
||
文件:AndroidPushServiceImpl.java
|
||
|
||
3.1 日志记录:记录接收到的推送消息
|
||
3.2 消息过滤检查:
|
||
- 检查是否被过滤(Utility.filterPush)
|
||
- 检查是否为朋友圈消息(line == 1)
|
||
- 如果被过滤,返回"Canceled"
|
||
|
||
3.3 异步处理:
|
||
- 使用线程池(ExecutorService)异步执行推送
|
||
- 立即返回"ok",不等待推送完成
|
||
- 设置超时保护(15秒)
|
||
|
||
3.4 根据pushType路由到对应厂商:
|
||
switch (pushMessage.getPushType()) {
|
||
case 8: // ANDROID_PUSH_TYPE_HONOR
|
||
honorPush.push(pushMessage);
|
||
break;
|
||
case 1: // 小米
|
||
case 2: // 华为
|
||
case 3: // 魅族
|
||
... 其他厂商
|
||
}
|
||
|
||
|
||
【步骤4】Honor推送处理
|
||
--------------------------------------------------------------------------------
|
||
文件:HonorPush.java
|
||
|
||
4.1 Token管理:
|
||
- 检查accessToken是否有效(未过期)
|
||
- 如果无效,调用refreshToken()刷新
|
||
- Token有效期:3600秒(1小时)
|
||
- 提前5分钟刷新,避免过期
|
||
|
||
4.2 获取认证Token(refreshToken方法):
|
||
- URL: https://iam.developer.honor.com/auth/token
|
||
- 方法:POST
|
||
- 参数:
|
||
* grant_type=client_credentials
|
||
* client_secret={appSecret}
|
||
* client_id={appId}
|
||
- 响应:包含access_token和expires_in
|
||
|
||
4.3 构建Honor API请求体:
|
||
- 调用RequestBody.buildRequestBody()方法
|
||
- 将PushMessage转换为Honor API格式
|
||
- 包含字段:
|
||
* notification.title: 推送标题
|
||
* notification.body: 推送内容
|
||
* token: [设备Token数组]
|
||
* android.notification: Android特定配置
|
||
* android.notification.badge: 角标配置
|
||
|
||
4.4 调用Honor推送API:
|
||
- URL: https://push-api.cloud.honor.com/api/v1/{appId}/sendMessage
|
||
- 方法:POST
|
||
- Headers:
|
||
* Content-Type: application/json
|
||
* Authorization: Bearer {accessToken}
|
||
* timestamp: 当前时间戳
|
||
- Body: Honor API格式的JSON
|
||
|
||
4.5 处理响应:
|
||
- 记录响应日志
|
||
- 检查响应中的code和message
|
||
- 如果成功:{"code":200,"message":"Success","data":{"sendResult":true}}
|
||
|
||
|
||
【步骤5】Honor服务器处理
|
||
--------------------------------------------------------------------------------
|
||
5.1 Honor服务器验证:
|
||
- 验证accessToken有效性
|
||
- 验证appId和appSecret
|
||
- 验证设备Token有效性
|
||
|
||
5.2 推送消息到设备:
|
||
- 通过Honor推送通道发送到指定设备
|
||
- 使用设备Token定位设备
|
||
|
||
|
||
【步骤6】手机设备接收
|
||
--------------------------------------------------------------------------------
|
||
6.1 Honor系统接收推送
|
||
6.2 根据packageName匹配应用
|
||
6.3 显示推送通知
|
||
6.4 用户点击后打开应用(使用badgeClass指定的Activity)
|
||
|
||
|
||
三、关键技术点
|
||
================================================================================
|
||
|
||
1. 异步处理机制
|
||
- 使用线程池异步执行推送,避免阻塞HTTP请求
|
||
- 立即返回"ok",提高响应速度
|
||
- 适合高并发场景
|
||
|
||
2. Token缓存机制
|
||
- 缓存accessToken,避免频繁请求
|
||
- 自动刷新,提前5分钟刷新避免过期
|
||
- 减少API调用次数
|
||
|
||
3. 多厂商支持
|
||
- 通过pushType路由到不同厂商实现
|
||
- 统一的PushMessage接口
|
||
- 各厂商独立实现
|
||
|
||
4. 配置管理
|
||
- 配置文件:config/honor.properties
|
||
- 关键配置:
|
||
* honor.appSecret: 应用密钥
|
||
* honor.appId: 应用ID
|
||
* honor.badgeClass: 应用入口Activity
|
||
|
||
5. 错误处理
|
||
- Token刷新失败:记录错误并返回
|
||
- API调用失败:记录异常日志
|
||
- 超时保护:15秒超时丢弃消息
|
||
|
||
|
||
四、配置文件说明
|
||
================================================================================
|
||
|
||
文件:config/honor.properties
|
||
|
||
honor.appSecret=8cdcbb2485c3f333fa8fd226707212adbe95d733bb672933c14c0d72e60b550f
|
||
honor.appId=104475849
|
||
honor.badgeClass=com.xunpaisoft.social.im.main.MainActivity
|
||
|
||
说明:
|
||
- appSecret和appId:用于获取Honor推送服务的认证Token,必须正确
|
||
- badgeClass:应用入口Activity,用于推送点击后打开应用
|
||
|
||
|
||
五、数据流转图
|
||
================================================================================
|
||
|
||
┌─────────────────┐
|
||
│ Python测试脚本 │
|
||
│ test_honor_push │
|
||
│ .py │
|
||
└────────┬────────┘
|
||
│ HTTP POST (JSON)
|
||
│ http://localhost:8080/android/push
|
||
▼
|
||
┌─────────────────┐
|
||
│ PushController │
|
||
│ (Spring Boot) │
|
||
└────────┬────────┘
|
||
│ 调用
|
||
▼
|
||
┌─────────────────┐
|
||
│AndroidPushService│
|
||
│ Impl (路由) │
|
||
└────────┬────────┘
|
||
│ pushType=8
|
||
▼
|
||
┌─────────────────┐
|
||
│ HonorPush │
|
||
│ (处理层) │
|
||
└────────┬────────┘
|
||
│ 1. 检查/刷新Token
|
||
│ 2. 构建请求体
|
||
│ 3. 调用API
|
||
▼
|
||
┌─────────────────┐
|
||
│ Honor推送API │
|
||
│ push-api.cloud. │
|
||
│ honor.com │
|
||
└────────┬────────┘
|
||
│ 推送消息
|
||
▼
|
||
┌─────────────────┐
|
||
│ Honor服务器 │
|
||
│ (消息分发) │
|
||
└────────┬────────┘
|
||
│ 通过推送通道
|
||
▼
|
||
┌─────────────────┐
|
||
│ 手机设备 │
|
||
│ (接收通知) │
|
||
└─────────────────┘
|
||
|
||
|
||
六、重要注意事项
|
||
================================================================================
|
||
|
||
1. 推送类型问题
|
||
- 源码中定义:ANDROID_PUSH_TYPE_HONOR = 9
|
||
- 实际运行版本使用:pushType = 8
|
||
- 测试脚本需要使用8才能正常工作
|
||
|
||
2. 端口配置
|
||
- 推送服务运行在:8080端口
|
||
- 测试脚本连接:http://localhost:8080/android/push
|
||
|
||
3. 返回"ok"不代表推送成功
|
||
- "ok"只表示请求已接收
|
||
- 实际推送在后台异步执行
|
||
- 需要查看日志确认推送结果
|
||
|
||
4. 配置参数重要性
|
||
- appSecret和appId错误:无法获取Token,推送完全失败
|
||
- badgeClass错误:可能影响推送或点击行为
|
||
- 必须从Honor开发者平台获取正确的配置
|
||
|
||
5. 设备Token
|
||
- 必须通过客户端SDK获取
|
||
- Token可能过期,需要定期更新
|
||
- 不同设备有不同的Token
|
||
|
||
|
||
七、日志查看
|
||
================================================================================
|
||
|
||
推送服务日志位置:/home/renjianbo/push/push_server/push.log
|
||
|
||
关键日志信息:
|
||
1. "Android push {...}" - 接收到的推送消息
|
||
2. "Honor refresh token" - 刷新Token
|
||
3. "Honor token refreshed successfully" - Token刷新成功
|
||
4. "Push message {...}" - 发送给Honor的请求体
|
||
5. "Push to ... response {...}" - Honor API的响应
|
||
|
||
查看命令:
|
||
tail -f /home/renjianbo/push/push_server/push.log | grep -i honor
|
||
|
||
|
||
八、常见问题排查
|
||
================================================================================
|
||
|
||
问题1:返回"ok"但手机收不到推送
|
||
排查步骤:
|
||
1. 查看推送服务日志,确认是否调用了HonorPush
|
||
2. 检查Token是否成功获取
|
||
3. 查看Honor API响应,确认sendResult是否为true
|
||
4. 检查设备Token是否有效
|
||
5. 检查手机通知权限和网络连接
|
||
|
||
问题2:显示"unknown push type"
|
||
原因:pushType不正确
|
||
解决:使用pushType=8(不是9)
|
||
|
||
问题3:Token刷新失败
|
||
原因:appSecret或appId配置错误
|
||
解决:检查honor.properties配置文件
|
||
|
||
问题4:推送服务连接失败
|
||
原因:推送服务未启动或端口不对
|
||
解决:确认服务运行在8080端口
|
||
|
||
|
||
九、测试脚本使用
|
||
================================================================================
|
||
|
||
文件:test_honor_push.py
|
||
|
||
使用方法:
|
||
python3 test_honor_push.py
|
||
|
||
修改参数:
|
||
- DEVICE_TOKEN:修改为实际的设备Token
|
||
- title和content:修改推送标题和内容
|
||
- sender和target:修改发送者和接收者ID
|
||
|
||
注意事项:
|
||
- 确保推送服务正在运行
|
||
- 确保设备Token有效
|
||
- 确保配置文件正确
|
||
|
||
|
||
十、总结
|
||
================================================================================
|
||
|
||
推送测试系统通过分层架构实现了从测试脚本到手机设备的完整推送流程。
|
||
关键特点是:
|
||
1. 异步处理,提高性能
|
||
2. Token缓存,减少API调用
|
||
3. 多厂商支持,统一接口
|
||
4. 配置分离,易于管理
|
||
|
||
整个流程是异步的,测试脚本发送请求后立即返回,实际推送在后台执行。
|
||
要确认推送是否成功,需要查看推送服务的日志文件。
|
||
|
||
================================================================================
|
||
文档生成时间:2026-01-04
|
||
================================================================================
|
||
|