You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取FCM即时送达状态(Now or Never模式)

如何即时获取FCM Now or Never模式的送达状态?

你的需求非常明确——要在发送Now or Never模式的FCM消息时,即时判断设备是否在线并得到送达结果,而XMPP的delivery_receipt_requested确实没法满足这个需求,因为它的回执是消息实际推送到设备时才会返回,离线设备根本不会触发这个回执。下面给你几个可行的方案和细节:

核心思路:利用FCM Now or Never模式的API同步响应

Now or Never模式的定义是:设置priority: "high" + time_to_live: 0,这意味着FCM不会缓存消息,只有当设备在线时才会投递,离线则直接丢弃。针对这种模式,FCM的HTTP v1 API会给出即时的同步反馈,不需要等待后续回执。

具体实现步骤

  1. 构造符合Now or Never模式的消息体
    在发送请求中必须包含以下字段(适配Android和iOS平台):

    {
      "message": {
        "token": "目标设备的FCM令牌",
        "notification": {
          "title": "测试标题",
          "body": "测试内容"
        },
        "android": {
          "priority": "high",
          "ttl": "0s"
        },
        "apns": {
          "headers": {
            "apns-priority": "10",
            "apns-expiration": "0"
          }
        }
      }
    }
    
  2. 使用FCM HTTP v1 API同步发送
    发送请求到https://fcm.googleapis.com/v1/projects/你的项目ID/messages:send,并带上有效的OAuth 2.0令牌完成认证。

  3. 解析响应判断状态

    • 如果设备在线且消息成功投递,API会返回200 OK,响应体里的success字段为1:
      {
        "name": "projects/xxx/messages/xxx",
        "success": 1,
        "failure": 0
      }
      
      此时可以判定送达状态为true。
    • 如果设备离线,FCM会直接返回对应错误(比如UNAVAILABLE或DEVICE_OFFLINE,具体错误码因平台略有差异),此时可以立刻判定送达状态为false。

为什么XMPP回执不适用?

XMPP的delivery_receipt_requested是用来确认消息已经到达设备客户端的回执,而Now or Never模式下如果设备离线,FCM根本不会保存这条消息,自然不会在设备上线后触发任何回执,所以你永远等不到离线时的失败反馈。而HTTP API的同步响应是FCM服务器在接收请求时就做出的判断,完全符合你的即时需求。

注意事项

  • 务必使用FCM HTTP v1 API,旧的Legacy HTTP API的反馈机制不够明确,可能无法准确获取即时状态。
  • 要区分开不同的错误码:比如QUOTA_EXCEEDED是配额超限,INVALID_ARGUMENT是消息格式错误,这些都不是设备离线导致的,需要单独处理。
  • 对于iOS设备,确保开启了APNs的高优先级推送权限,否则可能无法触发即时判断逻辑。

内容的提问来源于stack exchange,提问作者theshemul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:16:45