在 C++ 客户端应用上接收消息

如需接收简单的下行消息,每个客户端应用都需要在 firebase::messaging::Listener API 上实现这些方法。

初始化 FCM

您必须先初始化 FCM,然后才能使用它获取您的注册令牌或接收消息。

如需初始化 FCM,请调用 ::firebase::messaging::Initialize 并为其提供 ::firebase::App 对象以及 ::firebase::messaging::Listener 类的实现。

MyListener my_listener_implementation;
::firebase::messaging::Initialize(app, &my_listener_implementation);

获取注册令牌

初次启动您的应用时,FCM SDK 会为客户端应用实例生成一个注册令牌。如果您希望为 FCM 指定单一目标设备或者创建设备组,则需要获取此令牌。

您可以通过 ::firebase::messaging::Listener::OnTokenReceived 虚函数获取令牌的值。

void OnTokenReceived(const char* token) {
  LogMessage("The registration token is `%s`", token);

  // TODO: If necessary send token to application server.
}

接收和处理消息

如需接收消息,您的监听器类必须实现 OnMessage 虚函数。

重写 OnMessage

通过重写 ::firebase::messaging::Listener::OnMessage 方法,您可以根据收到的消息执行操作并获取消息数据:

void OnMessage(const ::firebase::messaging::Message& message) {
  LogMessage(TAG, "From: %s", message.from.c_str());
  LogMessage(TAG, "Message ID: %s", message.message_id.c_str());
}

消息可用于表示不同种类的传入数据。在大多数情况下,消息会在开发者发起后发送至应用。此外,您的应用还会收到用于表示消息已发送事件、消息发送错误事件及消息已删除事件的消息。您可以通过检查 Message::message_type 字段来区分这些特殊事件。

消息已删除

FCM 服务器删除待处理消息时发送至您的应用。Message::message_type 将是 "deleted_messages"。删除消息的原因可能是:

  1. FCM 服务器上存储的消息过多。

    如果应用服务器在设备离线时向 FCM 服务器发送大量不可折叠的消息,可能会出现这种情况。

  2. 设备长时间未连接,且应用服务器近期(过去 4 周内)向该设备上的应用发送了一条消息。

    建议在收到此调用后为应用执行与应用服务器的完全同步。