在 iOS 上发送上行消息

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

  • 接收消息的应用服务器地址(格式为 SENDER_ID@gcm.googleapis.com)。
  • 每个发送者 ID 专有的消息 ID。
  • 包含消息负载键值对的消息数据。

接收到此数据时,FCM 会编译一个 XMPP 节发送至应用服务器,并添加关于来源设备和应用的某些额外信息。

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

要向服务器发送上行消息,iOS 客户端应用需要撰写一条消息,连接到 FCM 并调用 sendMessage

要进行连接,请在 AppDelegate 中将 shouldEstablishDirectChannel 标志设为 YES。FCM 会管理连接,在您的应用转到后台时断开连接,并在应用每次返回前台时重新建立连接。

按如下所示配置对 sendMessage 的调用:

Objective-C

[[FIRMessaging messaging] sendMessage:message
                                   to:receiver
                        withMessageID:messageID
                           timeToLive:ttl];

Swift

Messaging.messaging().sendMessage(message,
                                     to: to,
                                     withMessageID: messageId,
                                     timeToLive: ttl)

其中:

  • to 是接收消息的应用服务器地址(格式为 SENDER_ID@gcm.googleapis.com)。

  • withMessageID 是唯一消息标识符。所有消息接收器回调都以此消息 ID 为基础。

  • message 是字符串形式的键和值的字典。所有不是字符串形式的键值对都将被忽略。

  • timeToLive 是生存时间。如果 FCM 在这一时限到期之前都无法传递消息,则会向客户端发回通知。

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

处理上行消息回调

通过添加侦听 sendDataMessageFailuresendDataMessageSuccess 的观察者来处理上行回调,然后从选择器中检索错误信息。在此示例中,FIRMessagingSendErrorNotification 是用于处理回调的选择器:

- (void)sendDataMessageFailure:(NSNotification *)notification {
  NSString *messageID = (NSString *)message.object;
}
- (void)sendDataMessageSuccess:(NSNotification *)notification {
  NSString *messageID = (NSString *)message.object;
  NSDictionary *userInfo = message.userInfo; // contains error info etc
}

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

在应用服务器上接收 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 连接服务器参考

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面