从 C++ 客户端应用发送上行消息

如果您的应用服务器实现了 XMPP 连接服务器协议,则可接收从用户设备发送至云中的上行消息。要发起一条上行消息,客户端应用需要发送一个包含以下信息的请求:

  • SENDER_ID@fcm.googleapis.com 格式表示的接收应用服务器的地址。
  • 对每个发送者 ID 唯一的消息 ID。
  • 包含消息载荷键值对的消息数据。

收到此类数据时,FCM 会构建一个 XMPP Stanza 并将其发送至应用服务器,并添加关于来源设备和应用的某些额外信息。

从 C++ 客户端应用发送上行消息

如需向服务器发送上行消息,C++ 客户端应用需要撰写一条消息并调用 Send,如下所示:

::firebase::messaging::Message message;
message.to = SENDER_ID + "@fcm.googleapis.com";
message.message_id = get_unique_message_id();
message.data["my_message", "Hello World");
message.data["my_action", "SAY HELLO");
message.time_to_live = TIME_TO_LIVE;
::firebase::messaging::Send(message);

其中:

  • message.to 是以 SENDER_ID@fcm.googleapis.com 格式表示的接收应用服务器的地址。

  • message.message_id 是唯一消息标识符。所有消息接收器回调都根据此消息 ID 标识。

  • message.data 是字符串形式的键值对。

  • message.time_to_live 指定当设备离线时应将消息保留在 FCM 存储空间中多长时间(以秒为单位)。如果 FCM 在这一时限到期之前都无法传递消息,则会向客户端发回通知。

FCM 客户端库会将消息缓存至客户端应用,并在客户端连接到服务器之后发送。收到消息后,FCM 会将其发送至应用服务器。

在应用服务器上接收 XMPP 消息

当 FCM 从客户端应用收到上行消息调用时,会生成一个必要的 XMPP Stanza,以用于发送上行消息。 FCM 会添加 categoryfrom 字段,然后向应用服务器发送一个类似以下格式的 Stanza:

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "category":"com.example.yourapp", // to know which app sent it
      "data":
      {
          "hello":"world",
      },
      "message_id":"m-123",
      "from":"REGID"
  }
  </gcm>
</message>

发送 ACK 消息

作为对上述上行消息的响应,应用服务器必须使用同一连接发送一条包含该唯一 消息 ID 的 ACK 消息。如果 FCM 未接收到 ACK 消息,可能会重新尝试向应用服务器发送该上行消息。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

如需详细了解上行消息语法,请参阅 XMPP 连接服务器参考