向设备组发送消息 (Android)

利用设备组消息传递功能,您可以向单个设备组添加多台设备。 这类似于主题 (topic) 消息传递,但设备组消息传递加入了身份验证,以确保组成员资格仅受您的服务器管理。例如,如果要向不同的手机型号发送不同的消息,您的服务器可以向相应的设备组添加或从中移除注册信息,并将相应的消息发送到每个设备组。设备组消息传递与主题消息传递的不同之处在于:设备组消息传递是从服务器上管理设备组,而不是直接在应用中管理。

您可以在应用服务器上通过旧版 XMPPHTTP 协议使用设备组消息传递功能。 Node.js 版 Firebase Admin SDK 的旧版本基于旧版协议,也提供设备组消息传递功能。一个通知键最多支持 20 台成员设备。

管理设备组

向设备组发送消息之前,您必须:

  1. 为想要添加到该组的每一台设备获取注册令牌 (registration token)。

  2. 创建 notification_key。它用于将某个组(通常对应一名用户)映射到该组的所有关联注册令牌,以此来标识设备组。您可以在应用服务器上创建通知键。

设备组基本管理操作(创建和移除组,以及添加或移除设备)通过应用服务器执行。如需查看所支持的键的列表,请参阅旧版 HTTP 协议参考

在应用服务器上管理设备组

创建设备组

如需创建设备组,需要发送一个 POST 请求,并在其中提供组名称及组中所含设备的注册令牌列表。 FCM 会返回一个代表该设备组的新 notification_key

HTTP POST 请求

发送如下请求至 https://fcm.googleapis.com/fcm/notification

https://fcm.googleapis.com/fcm/notification
Content-Type:application/json
Authorization:key=API_KEY
project_id:SENDER_ID

{
   "operation": "create",
   "notification_key_name": "appUser-Chris",
   "registration_ids": ["bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
                        "cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
                        ... ]

notification_key_name 是特定于设备组的唯一名称或标识符(例如,可以是用户名)。每组注册令牌的 notification_key_namenotification_key 都是唯一的。如果您的多个客户端应用的发送者 ID 都相同,则这些客户端应用的 notification_key_name 必须各不相同。这样可以确保消息只会发送到既定的目标应用。

响应格式

如果请求成功,将返回如下所示的 notification_key

{
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}

请保存此 notification_key 和对应的 notification_key_name,以便在后续操作中使用。

检索通知键

如果您需要检索现有的通知键,可在 GET 请求中使用 notification_key_name,如下所示:

https://fcm.googleapis.com/fcm/notification?notification_key_name=appUser-Chris
Content-Type:application/json
Authorization:key=API_KEY
project_id:SENDER_ID
{}

对于指定通知键名的每个 GET 请求,服务器都会返回一个独一无二的编码字符串。尽管每个字符串可能看起来像是不同的键,但它实际上是一个有效的“notification_key”值。

向设备组中添加设备及从中移除设备

如需向现有设备组中添加设备或从中移除设备,需要发送一个 operation 参数设为 addremove 的 POST 请求,并提供要添加或移除的设备对应的注册令牌。

HTTP POST 请求

例如,如需将注册令牌为 bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1... 的设备添加到 appUser-Chris,您需要发送此请求:

{
   "operation": "add",
   "notification_key_name": "appUser-Chris",
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ",
   "registration_ids": ["bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."]
}

响应格式

如果添加或移除设备的请求成功,将返回如下所示的 notification_key

{
   "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}

向设备组发送下行消息

向设备组发送消息的过程与向单台设备发送消息十分类似。您需要将 to 参数设为特定于设备组的通知键。如需详细了解载荷支持,请参阅消息类型。本页的示例展示了如何通过旧版 HTTP 和 XMPP 协议向设备组发送数据消息。

设备组 HTTP POST 请求

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "aUniqueKey",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!",
   }
}

设备组 HTTP 响应

以下是一个“成功”的示例:notification_key 有 2 个关联的注册令牌,且消息已成功发送至这两个令牌:

{
  "success": 2,
  "failure": 0
}

以下是一个“部分成功”的示例:notification_key 有 3 个关联的注册令牌。消息仅成功发送至其中一个注册令牌。响应消息列出了未收到消息的注册令牌 (registration_ids):

{
  "success":1,
  "failure":2,
  "failed_registration_ids":[
     "regId1",
     "regId2"
  ]
}

当消息未能发送至与某个 notification_key 关联的一个或多个注册令牌时,应用服务器应按退避时间重试。

如果服务器尝试向没有成员的设备组发送消息,则响应如下所示(0 个成功,0 个失败):

{
  "success": 0,
  "failure": 0
}

设备组 XMPP 消息

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to": "aUniqueKey",
      "message_id": "m-1366082849205" ,
      "data": {
          "hello":"This is a Firebase Cloud Messaging Device Group Message!"
      }
  }
  </gcm>
</message>

设备组 XMPP 响应

当消息成功发送至设备组中的任何一台设备时,XMPP 连接服务器都会发送 ACK 响应。当发送至组中所有设备的所有消息都失败时,XMPP 连接服务器会发送 NACK 响应。

以下是一个“成功”的示例:notification_key 有 3 个关联的注册令牌,且消息已成功发送至这 3 个令牌:

{
  "from": "aUniqueKey",
  "message_type": "ack",
  "success": 3,
  "failure": 0,
  "message_id": "m-1366082849205"
}

以下是一个“部分成功”的示例:notification_key 有 3 个关联的注册令牌。消息仅成功发送至其中一个注册令牌。响应消息列出了未收到消息的注册令牌:

{
  "from": "aUniqueKey",
  "message_type": "ack",
  "success":1,
  "failure":2,
  "failed_registration_ids":[
     "regId1",
     "regId2"
  ]
}

当 FCM 连接服务器未能将消息发送至组中的所有设备时,应用服务器将收到 NACK 响应。

如需查看消息选项的完整列表,请参阅所选连接服务器协议(HTTPXMPP)的参考信息。