利用设备组消息传递功能,您可以向单个设备组添加多台设备。 这类似于主题 (topic) 消息传递,但设备组消息传递加入了身份验证,以确保组成员资格仅受您的服务器管理。例如,如果要向不同的手机型号发送不同的消息,您的服务器可以向相应的设备组添加或从中移除注册信息,并将相应的消息发送到每个设备组。设备组消息传递与主题消息传递的不同之处在于:设备组消息传递是从服务器上管理设备组,而不是直接在应用中管理。
您可以在应用服务器上通过旧版 XMPP 或 HTTP 协议使用设备组消息传递功能。 Node.js 版 Firebase Admin SDK 的旧版本基于旧版协议,也提供设备组消息传递功能。一个通知键最多支持 20 台成员设备。
管理设备组
向设备组发送消息之前,您必须:
-
为想要添加到该组的每一台设备获取注册令牌 (registration token)。
-
创建
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_name
和 notification_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
参数设为 add
或 remove
的 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 响应。
如需查看消息选项的完整列表,请参阅所选连接服务器协议(HTTP 或 XMPP)的参考信息。