获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在 Android 上发送上游消息

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

如果您的应用服务器实现了XMPP 连接服务器协议,它可以接收从用户设备到云端的上游消息。要启动上游消息,客户端应用程序会发送包含以下内容的请求:

当它接收到这些数据时,FCM 构建一个 XMPP 节以发送到应用服务器,添加一些关于发送设备和应用的附加信息。

从 Android 客户端应用发送上游消息

您的 Android 应用可以使用FirebaseMessaging.send发送上游消息:

Java

FirebaseMessaging fm = FirebaseMessaging.getInstance();
fm.send(new RemoteMessage.Builder(SENDER_ID + "@fcm.googleapis.com")
        .setMessageId(Integer.toString(messageId))
        .addData("my_message", "Hello World")
        .addData("my_action","SAY_HELLO")
        .build());

Kotlin+KTX

val fm = Firebase.messaging
fm.send(remoteMessage("$SENDER_ID@fcm.googleapis.com") {
    setMessageId(messageId.toString())
    addData("my_message", "Hello World")
    addData("my_action", "SAY_HELLO")
})

处理上游消息回调

使用FirebaseMessaging ,您可以实现回调onMessageSentonSendError来检查上游消息的状态。在错误情况下, onSendError返回带有错误代码的SendException 。例如,如果客户端在达到 20 条消息限制后尝试发送更多消息,它会返回SendException#ERROR_TOO_MANY_MESSAGES

在设备离线或 FCM 服务无法将上游消息转发到您的服务器的情况下,Android 客户端应用程序实例最多可累积 20 条待处理消息。如果此类消息在 FCM 成功发送之前到期, onSendError将返回SendException#ERROR_TTL_EXCEEDED

为了优化网络使用,FCM 会批量响应onMessageSentonSendError ,因此可能不会立即对每条消息进行确认。

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

当 FCM 接收到来自客户端应用程序的上游消息传递调用时,它会生成必要的 XMPP 节以发送上游消息。 FCM 添加categoryfrom字段,然后向应用服务器发送如下所示的节:

<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 连接服务器参考