6.0 KiB
6.0 KiB
离线消息问题排查指南
问题描述
应用进程未启动时收不到离线消息,厂商通道推送消息无法正确处理。
问题根因分析
1. 主要问题:DefaultPushMessageHandler 空实现
问题: DefaultPushMessageHandler.handleIMPushMessage() 方法是空实现
影响: 厂商通道推送消息无法触发应用启动和消息拉取
修复: 添加应用启动和消息拉取逻辑
2. 厂商通道推送流程
厂商推送服务 → 应用推送进程 → DefaultPushMessageHandler → 应用启动 → 消息拉取
已修复的问题
1. DefaultPushMessageHandler 修复
@Override
public void handleIMPushMessage(Context context, AndroidPushMessage pushMessage, int pushServiceType) {
Log.d(TAG, "handleIMPushMessage: " + pushMessage);
// 启动主进程
PushService.showMainActivity(context);
// 强制连接服务器拉取消息
try {
ChatManager.Instance().forceConnect();
Log.d(TAG, "forceConnect called successfully");
} catch (Exception e) {
Log.e(TAG, "forceConnect failed", e);
}
}
2. 推送消息数据处理修复
@Override
public void handlePushMessageData(Context context, String pushData) {
Log.d(TAG, "handlePushMessageData: " + pushData);
// 启动主进程
PushService.showMainActivity(context);
// 强制连接服务器拉取消息
try {
ChatManager.Instance().forceConnect();
Log.d(TAG, "forceConnect called successfully");
} catch (Exception e) {
Log.e(TAG, "forceConnect failed", e);
}
}
排查步骤
步骤1: 检查推送消息处理日志
# 监控推送消息处理日志
adb logcat | grep "DefaultPushMessageHandler\|handleIMPushMessage\|handlePushMessageData"
关键日志:
handleIMPushMessage: xxxxx- 推送消息处理handlePushMessageData: xxxxx- 推送数据处理forceConnect called successfully- 消息拉取成功
步骤2: 检查应用启动日志
# 监控应用启动日志
adb logcat | grep "showMainActivity\|forceConnect"
关键日志:
showMainActivity: started via action- 应用启动成功forceConnect called successfully- 消息拉取成功
步骤3: 检查厂商推送消息接收
# 监控厂商推送消息接收
adb logcat | grep "MiPush\|HMS\|VIVO\|OPPO\|FCM"
关键日志:
onNotificationMessageArrived- 通知消息到达onReceivePassThroughMessage- 透传消息到达onMessageReceived- FCM消息到达
步骤4: 检查推送服务初始化
# 监控推送服务初始化
adb logcat | grep "PushService\|推送服务\|setDeviceToken"
关键日志:
开始初始化小米推送服务- 推送服务初始化小米推送注册成功,RegID: xxxxx- 推送注册成功设备Token设置成功: xxxxx- 设备Token设置成功
测试验证
测试1: 完整离线消息测试
- 清除应用数据
- 重新安装应用
- 启动应用并登录
- 检查推送注册日志
- 完全关闭应用
- 发送测试消息
- 观察推送消息日志
测试2: 分步测试
- 推送注册测试: 检查推送服务是否正确注册
- 消息接收测试: 检查推送消息是否正确接收
- 消息处理测试: 检查推送消息是否正确处理
- 应用启动测试: 检查应用是否正确启动
- 消息拉取测试: 检查消息是否正确拉取
常见问题及解决方案
问题1: 推送消息到达但应用未启动
症状: 看到推送消息日志但没有应用启动日志 可能原因:
showMainActivity方法有问题- 应用启动逻辑有问题
解决方案:
- 检查
PushService.showMainActivity()方法 - 检查应用启动权限
- 检查系统权限设置
问题2: 应用启动但消息未拉取
症状: 看到应用启动日志但没有消息拉取日志 可能原因:
ChatManager未初始化- 网络连接问题
forceConnect方法有问题
解决方案:
- 检查
ChatManager初始化 - 检查网络连接
- 检查
forceConnect方法
问题3: 推送消息完全收不到
症状: 没有任何推送相关日志 可能原因:
- 推送服务未初始化
- 系统权限被禁用
- 厂商推送服务异常
解决方案:
- 检查推送服务初始化日志
- 检查系统权限设置
- 重启厂商推送服务
系统权限检查
小米手机MIUI设置
- ✅ 自启动管理: 开启
- ✅ 后台运行权限: 开启
- ✅ 通知权限: 开启
- ✅ 电池优化: 关闭
华为手机EMUI设置
- ✅ 自启动管理: 开启
- ✅ 后台运行权限: 开启
- ✅ 通知权限: 开启
- ✅ 电池优化: 关闭
VIVO手机FuntouchOS设置
- ✅ 自启动管理: 开启
- ✅ 后台运行权限: 开启
- ✅ 通知权限: 开启
- ✅ 电池优化: 关闭
OPPO手机ColorOS设置
- ✅ 自启动管理: 开启
- ✅ 后台运行权限: 开启
- ✅ 通知权限: 开启
- ✅ 电池优化: 关闭
调试技巧
1. 使用详细日志
adb logcat -v time | grep "DefaultPushMessageHandler\|showMainActivity\|forceConnect"
2. 监控特定进程
adb shell ps | grep "com.xunpaisoft.social"
3. 检查系统状态
adb shell dumpsys package com.xunpaisoft.social
预期效果
修复后应该能够:
- ✅ 应用进程未启动时收到推送通知
- ✅ 点击推送通知正确启动应用
- ✅ 应用启动后立即显示新消息
- ✅ 后台运行时正常接收推送
- ✅ 开机后正常接收推送
注意事项
- 推送消息类型: 确保服务器发送的是透传消息,不是通知消息
- 推送消息格式: 确保消息格式符合厂商推送要求
- 系统权限: 确保所有必要的系统权限都已授予
- 网络连接: 确保设备有网络连接
- 推送服务: 确保推送服务正常运行
联系支持
如果问题仍然存在,请提供以下信息:
- 完整的日志输出
- 设备型号和系统版本
- 应用版本信息
- 测试步骤和结果