设置消息的有效期

FCM 通常会在消息发出之后马上进行传递。但是,也有一些例外情况。例如,设备可能无法连接,或者 FCM 可能会有意地延迟消息传递,以防止应用消耗过多资源和对电池续航时间产生不良影响。

在这种情况下,FCM 会存储消息,并尽快发送。尽管大多数情况下这样做都没什么问题,但有些应用要求通知必须及时发送。例如,来电通知或活动邀请。

在 Android 和 Web 上,您可以指定消息的最长有效期。此值必须是介于 0 至 2,419,200 秒(28 天)之间的一段持续时间,其对应于 FCM 存储并尝试传递消息的最长时间期限。默认情况下,不含此字段的请求最长持续时间为四周。

在 iOS 上,您可以在 ApnsConfig 对象中设置 apns-expiration 标头。如需了解详情,请参阅 Apple 关于向 APNs 发送通知请求的文档。

以下是此功能的一些可能用途:

  • 视频聊天来电
  • 即将到期的邀请事件
  • 日历活动

指定消息有效期的另一个好处是 FCM 不会对存留时间值为 0 秒的消息应用可折叠消息节流功能。请留意,ttl 值为 0 表示不能立即传递的消息会被舍弃。不过,由于此类消息不会被存储,因此可以为发送通知消息提供最佳延时。

以下是包含 TTL 的请求示例:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    },
    "apns":{
      "headers":{
        "apns-expiration":"1604750400"
      }
    },
    "android":{
      "ttl":"4500s"
    },
    "webpush":{
      "headers":{
        "TTL":"4500"
      }
    }
  }
}

消息的有效期

当应用服务器向 FCM 发布消息并收到返回的消息 ID 时,并不意味着消息已传递至设备,而是表示其获准传递。消息的送达时间取决于多种因素。

如果设备已连接但是处于低电耗模式,则 FCM 将存储低优先级的消息,直到设备不再处于低电耗模式为止。如果设置了 collapse_key,并且存在一条具有相同折叠键和注册令牌且正等待传递的现有消息,则旧消息将被舍弃,然后新消息将取代其位置。但是,如果未设置折叠键,则新消息和旧消息都将被存储下来供以后传递。

如果设备未连接到 FCM,则消息会被存储,直到建立连接。建立连接后,FCM 会将所有待处理消息传递到设备。如果设备不再建立连接,则消息最终会超时,且将被从 FCM 存储中舍弃。除非设置了 ttl 标志,否则默认的超时时间为四个星期。如果 FCM 尝试向设备传递消息时,应用已被卸载,FCM 将立刻舍弃该消息并废弃注册令牌。其后尝试向该设备发送消息将导致 NotRegistered 错误。

对于 Android 设备,如果设备已有一个多月未连接到 FCMFCM 仍然会接受消息,但会立即将其舍弃。如果设备在您向其发送最后一条数据消息后的四个星期内建立连接,您的客户端应用会收到 onDeletedMessages() 回调。

如需详细了解 Android 或 Apple 平台上的消息传送,您可以使用 FCM 报告信息中心。该信息中心会记录在 Apple 和 Android 设备上发送和打开的消息数量,以及 Android 应用的展示次数数据。