Firebase Cloud Messaging 消息类型

您可以使用 FCM 向客户端应用发送两种类型的消息:

  • 通知消息(类似于“显示消息”)由 FCM SDK 自动处理。
  • 数据消息,由客户端应用处理。

通知消息包含一组预定义的用户可见的键,并且可以包含可选的数据载荷。与其相对,数据消息只包含用户定义的自定义键值对。两种消息类型的载荷上限均为 4096 个字节,但从 Firebase 控制台发送消息时会强制执行 1000 个字符的限制。

使用情景 如何发送
通知消息 当客户端应用在后台运行时,FCM SDK 会代表客户端应用向最终用户设备显示消息。如果应用在收到通知时正在前台运行,应用的代码会决定行为。
  1. 在可信环境(例如 Cloud Functions 或应用服务器)中,使用 Firebase Admin SDK 或 HTTP v1 API。设置 notification 键。可能包含可选的数据有效负载。一律可折叠。

    请参阅一些显示通知示例并发送请求载荷。

  2. 使用 Notifications Composer:输入消息文本、标题等,然后发送。通过提供自定义数据添加可选的数据载荷。
数据消息 客户端应用负责处理数据消息。数据消息仅包含自定义键值对,没有保留键名(请参阅下文)。 在可信环境(例如 Cloud Functions 或应用服务器)中,使用 Firebase Admin SDK 或 HTTP v1 API。在发送请求中,设置 data 键。

当您的应用在后台运行时,如果您希望 FCM SDK 自动处理通知的显示,可以使用通知消息。FCM 可以发送包含可选的数据载荷的通知消息。在此类情况下,FCM 会显示通知载荷,而客户端应用会处理数据载荷。

如果您希望使用自己的客户端应用代码处理消息,可以使用数据消息。

通知消息

您可以使用 Firebase 控制台、Firebase Admin SDK 或 FCM HTTP v1 API 发送通知消息。Firebase 控制台提供基于分析的 A/B 测试,可帮助您优化和改进通知消息。

如需使用 Firebase Admin SDK 或 FCM HTTP v1 API 发送通知消息,请将 notification 键设置为通知消息的预定义键值对选项集。您可以使用以下示例来格式化即时通讯应用中的通知消息

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

应用在后台运行时,通知消息将被传递至通知面板。应用在前台运行时,消息由回调函数处理。

如需可用于构建通知消息的预定义键的完整列表,请参阅 FCM HTTP v1 API 通知对象参考文档。

数据消息

您可以自行决定如何使用 FCM 载荷 data 来实现所选的加密方案。请确保未在自定义键值对中使用任何保留字词。预留字词包括 from、message_type 或以 google.、gcm. 或 gcm.notification. 开头的任何字词。

以下示例显示了顶级或通用数据字段的用法,该字段由接收消息的所有平台上的客户端解读。在每个平台上,客户端应用都会在回调函数中收到数据载荷。

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

包含可选数据载荷的通知消息

无论是通过编程方式还是通过 Firebase 控制台,您都可以发送包含由自定义键值对组成的可选载荷的通知消息。在 Notifications Composer 中,使用高级选项中的自定义数据字段。

接收同时包含通知载荷和数据载荷的消息时,应用的行为取决于应用是在后台还是前台运行,特别是在接收时应用是否处于活跃状态。

  • 在后台运行时,应用会在通知面板中接收通知载荷,且仅在用户点按通知时处理数据载荷。
  • 在前台运行时,您的应用将会接收一个提供两种载荷的消息对象。

以下是包含 notification 键和 data 键的 JSON 格式的消息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}