Android设备离线重连后Firebase Cloud Messaging推送通知丢失求助
Android FCM v1离线后仅收到最后一条推送的解决方案
核心原因
FCM当前对通知消息(由FCM SDK自动展示的消息)的默认逻辑是:如果多条消息使用相同的tag、collapse_key,或者未指定唯一标识,离线时会被合并为最后一条,联网后仅推送合并后的消息。而GCM时期的缓存逻辑已被FCM调整,旧答案不再适用。
解决方案
1. 改用数据消息发送
放弃FCM的默认通知消息格式,全部发送数据消息(仅包含data字段,无notification字段)。FCM会为数据消息缓存所有离线消息(只要ttl设置合理),联网后全部推送给App,由App自行处理展示。
发送请求体示例:
{ "message": { "token": "你的设备Token", "data": { "title": "自定义标题", "content": "自定义内容", "msg_id": "唯一消息ID" // 用于区分每条消息 }, "android": { "ttl": "86400s" // 设置消息存活时间,最长可设为4周 } } }
2. 避免使用重复的collapse_key
如果必须使用通知消息,确保每条消息的collapse_key设置为唯一值(比如用消息ID),或者完全不设置该字段。相同的collapse_key会触发FCM的消息合并逻辑,只保留最后一条。
3. 升级Firebase Messaging SDK
确保项目使用最新版本的FCM SDK,旧版本可能存在缓存逻辑的bug。在build.gradle中更新依赖:
implementation 'com.google.firebase:firebase-messaging:23.4.0' // 替换为当前最新版本
4. 自定义通知展示逻辑
在FirebaseMessagingService的onMessageReceived方法中,自行处理数据消息并创建通知,使用唯一的通知ID(比如消息ID)确保每条通知单独显示,避免系统合并:
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Map<String, String> data = remoteMessage.getData(); String title = data.get("title"); String content = data.get("content"); String msgId = data.get("msg_id"); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); String channelId = "default_channel"; NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_notif) .setContentTitle(title) .setContentText(content) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true); // 用唯一的msgId作为通知ID,确保每条通知不被合并 notificationManager.notify(Integer.parseInt(msgId), builder.build()); }
5. 检查设备通知设置
确保App的通知权限已开启,且未开启系统的「通知分组」「静默通知」等可能导致通知合并的设置。
内容的提问来源于stack exchange,提问作者calvin sugianto
相关产品推荐
相关产品推荐

