Spring Boot项目中如何获取FCM推送通知的设备送达状态?
第一步:调整现有发送逻辑获取消息唯一标识
你当前的代码未接收FCM接口返回的消息唯一ID,查询送达状态必须依赖这个ID,首先修改发送逻辑存储消息ID:
// 定义FCM发送响应接收类,也可直接用Map<String,Object>快速接收 @Data public class FCMSendResponse { // FCM返回的全局唯一消息标识,格式为 projects/{你的项目ID}/messages/{消息ID} private String name; } private FCMSendResponse sendNotification(FCMMessageRequestDTO fcmMessageRequestDTO) { MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); headers.set("Authorization", fcmAuthorizationKey); headers.add("Content-Type", "application/json"); RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpEntity<FCMMessageRequestDTO> request = new HttpEntity<>(fcmMessageRequestDTO, headers); // 接收发送响应,拿到消息唯一标识 FCMSendResponse response = restTemplate.postForObject(fcmMessageUrl, request, FCMSendResponse.class); // 此处需将消息ID、接收人设备标识、发送时间等信息存入你的业务数据库,后续查询关联用 return response; }
第二步:送达状态查询的两种实现方案
- 方案1:调用FCM官方送达数据API查询
该方案需要你将Firebase套餐升级到Blaze付费版本,免费版不支持。首先在Google Cloud控制台启用FCM数据查询API,使用Firebase服务账号生成OAuth2.0访问凭证,调用对应查询接口即可获取单条消息的送达状态、展示状态、点击状态等数据,查询结果存在最长15分钟的延迟。 - 方案2:客户端主动上报状态(无付费门槛,推荐中小项目使用)
不需要调用FCM额外接口,在客户端集成FCM SDK时新增两个上报逻辑:- 客户端收到通知时,调用你的后端上报接口,传入消息ID、设备标识、送达时间
- 用户点击通知时,再次调用后端接口上报点击状态
后端将上报的状态和发送时存储的消息ID关联,直接查询自有数据库即可获取实时送达状态,适配全平台,不需要额外付费。
注意事项
- 你当前使用的是FCM旧版HTTP API,官方已公告即将废弃,建议后续升级到FCM v1 API,对消息追踪、错误处理的支持更完善
- 如果消息发送时就出现错误(比如设备token无效、配额超限),直接从发送请求的响应中就能拿到对应错误码,不需要走后续状态查询流程
- iOS端后台通知的送达上报需要额外配置通知服务扩展,确保能在后台收到通知时触发上报逻辑
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

