关于Firebase主题推送通知:如何获取用户接收详情及后台接收状态?
Firebase主题推送:后台接收判断与精准接收报告方案
一、确认应用后台时是否收到通知
Android端
- 分两种推送类型处理:
- 通知消息(payload带
notification字段):后台时系统直接接管并展示到通知栏,不会触发FirebaseMessagingService的onMessageReceived。如果要确认接收,可以通过NotificationListenerService监听系统通知栏的新增通知事件,以此判断通知是否送达。 - 数据消息(仅含
data字段):无论前后台都会触发onMessageReceived,你可以在这个方法里直接记录接收日志,或者上报到后端。 - 另外,也可以重写
FirebaseMessagingService的handleIntent方法,拦截所有推送意图来判断接收状态。
- 通知消息(payload带
iOS端
- 后台时通知由APNs处理,可通过以下回调跟踪:
- iOS 10+ 用
UNUserNotificationCenterDelegate的didReceiveNotificationResponse(用户点击通知时触发)和willPresentNotification(后台时只有开启通知显示权限才会触发),在这些方法里记录接收事件。 - 旧版本可以用
AppDelegate的didReceiveRemoteNotification,后台时会短暂唤醒应用执行代码,适合上报接收状态。 - APNs本身会返回推送结果,但需要通过其反馈服务或结合Firebase Admin SDK的令牌验证,来确认令牌有效性(比如令牌过期、设备卸载)。
- iOS 10+ 用
二、获取主题推送的精准接收/未接收数据
Firebase控制台只有聚合统计,要拿到单用户级别的精准数据,需要自行实现跟踪逻辑:
1. 客户端主动上报接收状态
- 在客户端的通知接收回调中(比如Android的
onMessageReceived、iOS的didReceiveRemoteNotification),一旦确认收到通知,就调用自己的后端接口,上报用户ID、设备令牌、推送消息ID、接收时间等核心信息。 - 未接收的用户无法直接从客户端获取,但可以通过对比你维护的主题订阅用户列表和客户端上报的接收列表,差值即为未接收的用户(需排除令牌无效、设备长期离线等情况)。
2. 结合Firebase Admin SDK跟踪推送结果
- 先维护自己的主题订阅库:调用Admin SDK的
subscribeToTopic时,记录每个用户对应的设备令牌、订阅主题、订阅时间等信息,形成自己的订阅列表(避免依赖Firebase的主题查询限制)。 - 发送主题推送时,使用Admin SDK的
sendToTopic方法,获取返回的BatchResponse对象,里面包含成功/失败的数量,以及失败令牌的具体错误原因(比如令牌无效、设备离线)。将失败令牌与你的订阅库匹配,就能定位到具体未收到推送的用户。
3. 内部事件分析系统埋点
- 在客户端接收通知的逻辑中,添加事件埋点(比如上报
topic_notification_received事件),将数据同步到内部的用户行为分析平台。 - 通过平台的事件查询功能,筛选出触发过该事件的用户;未触发的用户即为未接收推送的对象(需排除用户卸载、设备未联网等特殊情况)。
关键注意事项
- 区分推送失败与用户未查看:推送失败是FCM/APNs无法送达设备,未查看是设备收到但用户未点击,两者需要分开统计。
- 定期验证设备令牌有效性:用Admin SDK的
batchCheck接口批量验证令牌,清理订阅库中的无效令牌,避免无效数据影响统计准确性。
内容的提问来源于stack exchange,提问作者Adeel Ali
相关产品推荐
相关产品推荐

