Используя Firebase Admin SDK или протоколы сервера приложений FCM, вы можете создавать запросы сообщений и отправлять их следующим типам целей:
- Название темы
- Состояние
- Токен регистрации устройства
- Имя группы устройств (только протокол)
Вы можете отправлять сообщения с полезной нагрузкой уведомления, состоящей из предопределенных полей, полезной нагрузкой данных из ваших собственных полей, определенных пользователем, или сообщением, содержащим оба типа полезной нагрузки. Дополнительные сведения см. в разделе Типы сообщений .
В примерах на этой странице показано, как отправлять уведомления с помощью Firebase Admin SDK (который поддерживает Node , Java , Python , C# и Go ) и протокола HTTP v1 . Существует также руководство по отправке сообщений через устаревшие устаревшие протоколы HTTP и XMPP .
Отправка сообщений на определенные устройства
Чтобы отправить на одно конкретное устройство, передайте токен регистрации устройства, как показано. См. информацию о настройке клиента для вашей платформы, чтобы узнать больше о токенах регистрации.
Node.js
// This registration token comes from the client FCM SDKs.
const registrationToken = 'YOUR_REGISTRATION_TOKEN';
const message = {
data: {
score: '850',
time: '2:45'
},
token: registrationToken
};
// Send a message to the device corresponding to the provided
// registration token.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Джава
// This registration token comes from the client FCM SDKs.
String registrationToken = "YOUR_REGISTRATION_TOKEN";
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setToken(registrationToken)
.build();
// Send a message to the device corresponding to the provided
// registration token.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Питон
# This registration token comes from the client FCM SDKs.
registration_token = 'YOUR_REGISTRATION_TOKEN'
# See documentation on defining a message payload.
message = messaging.Message(
data={
'score': '850',
'time': '2:45',
},
token=registration_token,
)
# Send a message to the device corresponding to the provided
# registration token.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Идти
// Obtain a messaging.Client from the App.
ctx := context.Background()
client, err := app.Messaging(ctx)
if err != nil {
log.Fatalf("error getting Messaging client: %v\n", err)
}
// This registration token comes from the client FCM SDKs.
registrationToken := "YOUR_REGISTRATION_TOKEN"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Token: registrationToken,
}
// Send a message to the device corresponding to the provided
// registration token.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
С#
// This registration token comes from the client FCM SDKs.
var registrationToken = "YOUR_REGISTRATION_TOKEN";
// See documentation on defining a message payload.
var message = new Message()
{
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
Token = registrationToken,
};
// Send a message to the device corresponding to the provided
// registration token.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"body":"This is an FCM notification message!",
"title":"FCM Message"
}
}
}
URL-команда:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
"notification":{
"title":"FCM Message",
"body":"This is an FCM Message"
},
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
В случае успеха каждый метод отправки возвращает идентификатор сообщения. Firebase Admin SDK возвращает строку идентификатора в формате projects/{project_id}/messages/{message_id}
. Ответ протокола HTTP представляет собой один ключ JSON:
{
"name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96"
}
Отправка сообщений на несколько устройств
API-интерфейсы Admin FCM позволяют выполнять многоадресную рассылку сообщения в список токенов регистрации устройств. Вы можете указать до 500 токенов регистрации устройств на вызов.
Node.js
// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
'YOUR_REGISTRATION_TOKEN_1',
// …
'YOUR_REGISTRATION_TOKEN_N',
];
const message = {
data: {score: '850', time: '2:45'},
tokens: registrationTokens,
};
getMessaging().sendMulticast(message)
.then((response) => {
console.log(response.successCount + ' messages were sent successfully');
});
Джава
// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n"
);
MulticastMessage message = MulticastMessage.builder()
.putData("score", "850")
.putData("time", "2:45")
.addAllTokens(registrationTokens)
.build();
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);
// See the BatchResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " messages were sent successfully");
питон
# Create a list containing up to 500 registration tokens.
# These registration tokens come from the client FCM SDKs.
registration_tokens = [
'YOUR_REGISTRATION_TOKEN_1',
# ...
'YOUR_REGISTRATION_TOKEN_N',
]
message = messaging.MulticastMessage(
data={'score': '850', 'time': '2:45'},
tokens=registration_tokens,
)
response = messaging.send_multicast(message)
# See the BatchResponse reference documentation
# for the contents of response.
print('{0} messages were sent successfully'.format(response.success_count))
Идти
// Create a list containing up to 500 registration tokens.
// This registration tokens come from the client FCM SDKs.
registrationTokens := []string{
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n",
}
message := &messaging.MulticastMessage{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Tokens: registrationTokens,
}
br, err := client.SendMulticast(context.Background(), message)
if err != nil {
log.Fatalln(err)
}
// See the BatchResponse reference documentation
// for the contents of response.
fmt.Printf("%d messages were sent successfully\n", br.SuccessCount)
С#
// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n",
};
var message = new MulticastMessage()
{
Tokens = registrationTokens,
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
};
var response = await FirebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");
Возвращаемое значение — это список токенов, соответствующий порядку входных токенов. Это полезно, когда вы хотите проверить, какие токены привели к ошибкам.
Node.js
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
'YOUR_REGISTRATION_TOKEN_1',
// …
'YOUR_REGISTRATION_TOKEN_N',
];
const message = {
data: {score: '850', time: '2:45'},
tokens: registrationTokens,
};
getMessaging().sendMulticast(message)
.then((response) => {
if (response.failureCount > 0) {
const failedTokens = [];
response.responses.forEach((resp, idx) => {
if (!resp.success) {
failedTokens.push(registrationTokens[idx]);
}
});
console.log('List of tokens that caused failures: ' + failedTokens);
}
});
Джава
// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n"
);
MulticastMessage message = MulticastMessage.builder()
.putData("score", "850")
.putData("time", "2:45")
.addAllTokens(registrationTokens)
.build();
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);
if (response.getFailureCount() > 0) {
List<SendResponse> responses = response.getResponses();
List<String> failedTokens = new ArrayList<>();
for (int i = 0; i < responses.size(); i++) {
if (!responses.get(i).isSuccessful()) {
// The order of responses corresponds to the order of the registration tokens.
failedTokens.add(registrationTokens.get(i));
}
}
System.out.println("List of tokens that caused failures: " + failedTokens);
}
Питон
# These registration tokens come from the client FCM SDKs.
registration_tokens = [
'YOUR_REGISTRATION_TOKEN_1',
# ...
'YOUR_REGISTRATION_TOKEN_N',
]
message = messaging.MulticastMessage(
data={'score': '850', 'time': '2:45'},
tokens=registration_tokens,
)
response = messaging.send_multicast(message)
if response.failure_count > 0:
responses = response.responses
failed_tokens = []
for idx, resp in enumerate(responses):
if not resp.success:
# The order of responses corresponds to the order of the registration tokens.
failed_tokens.append(registration_tokens[idx])
print('List of tokens that caused failures: {0}'.format(failed_tokens))
Идти
// Create a list containing up to 500 registration tokens.
// This registration tokens come from the client FCM SDKs.
registrationTokens := []string{
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n",
}
message := &messaging.MulticastMessage{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Tokens: registrationTokens,
}
br, err := client.SendMulticast(context.Background(), message)
if err != nil {
log.Fatalln(err)
}
if br.FailureCount > 0 {
var failedTokens []string
for idx, resp := range br.Responses {
if !resp.Success {
// The order of responses corresponds to the order of the registration tokens.
failedTokens = append(failedTokens, registrationTokens[idx])
}
}
fmt.Printf("List of tokens that caused failures: %v\n", failedTokens)
}
С#
// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
"YOUR_REGISTRATION_TOKEN_1",
// ...
"YOUR_REGISTRATION_TOKEN_n",
};
var message = new MulticastMessage()
{
Tokens = registrationTokens,
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
};
var response = await FirebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message);
if (response.FailureCount > 0)
{
var failedTokens = new List<string>();
for (var i = 0; i < response.Responses.Count; i++)
{
if (!response.Responses[i].IsSuccess)
{
// The order of responses corresponds to the order of the registration tokens.
failedTokens.Add(registrationTokens[i]);
}
}
Console.WriteLine($"List of tokens that caused failures: {failedTokens}");
}
Отправляйте сообщения в темы
После того, как вы создали тему, либо подписав экземпляры клиентского приложения на тему на стороне клиента, либо через API сервера , вы можете отправлять сообщения в тему. Если вы впервые создаете запросы на отправку для FCM, см. руководство по вашей серверной среде и FCM , где содержится важная справочная информация и информация по настройке.
В логике отправки на серверной части укажите желаемое имя темы, как показано ниже:
Node.js
// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';
const message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};
// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Джава
// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setTopic(topic)
.build();
// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Питон
# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'
# See documentation on defining a message payload.
message = messaging.Message(
data={
'score': '850',
'time': '2:45',
},
topic=topic,
)
# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Идти
// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Topic: topic,
}
// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
С#
// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";
// See documentation on defining a message payload.
var message = new Message()
{
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
Topic = topic,
};
// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic" : "foo-bar",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message"
}
}
}
URL-команда:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message": {
"topic" : "foo-bar",
"notification": {
"body": "This is a Firebase Cloud Messaging Topic Message!",
"title": "FCM Message"
}
}
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Чтобы отправить сообщение в комбинацию тем, укажите условие , которое представляет собой логическое выражение, задающее целевые темы. Например, следующее условие будет отправлять сообщения на устройства, которые подписаны на TopicA
и TopicB
или TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM сначала оценивает любые условия в круглых скобках, а затем вычисляет выражение слева направо. В приведенном выше выражении пользователь, подписанный на какую-либо отдельную тему, не получает сообщение. Точно так же пользователь, не подписанный на TopicA
, не получит сообщение. Эти комбинации действительно получают его:
-
TopicA
иTopicB
-
TopicA
иTopicC
В условное выражение можно включить до пяти тем.
Для отправки в состояние:
Node.js
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';
// See documentation on defining a message payload.
const message = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
condition: condition
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Джава
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle("$GOOG up 1.43% on the day")
.setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
.build())
.setCondition(condition)
.build();
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
Питон
# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"
# See documentation on defining a message payload.
message = messaging.Message(
notification=messaging.Notification(
title='$GOOG up 1.43% on the day',
body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
),
condition=condition,
)
# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
Идти
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Condition: condition,
}
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
С#
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
var message = new Message()
{
Notification = new Notification()
{
Title = "$GOOG up 1.43% on the day",
Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Condition = condition,
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"condition": "'dogs' in topics || 'cats' in topics",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message",
}
}
}
URL-команда:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"notification": {
"title": "FCM Message",
"body": "This is a Firebase Cloud Messaging Topic Message!",
},
"condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Отправка сообщений группам устройств
Чтобы отправлять сообщения группам устройств, используйте API HTTP v1. Если вы в настоящее время отправляете сообщения группам устройств, используя устаревшие API отправки для HTTP или XMPP или любую из более старых версий Firebase Admin SDK для Node.js на основе устаревших протоколов, мы настоятельно рекомендуем вам перейти на HTTP v1. API при первой же возможности. Устаревшие API отправки будут отключены и удалены в июне 2024 года.
Отправка сообщений группе устройств очень похожа на отправку сообщений отдельному устройству с использованием того же метода для авторизации запросов на отправку . Установите в поле token
ключ группового уведомления:
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ",
"data":{
"hello": "This is a Firebase Cloud Messaging device group message!"
}
}
}
cURL-команда
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
"data":{
"hello": "This is a Firebase Cloud Messaging device group message!"
},
"token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
Отправить пакет сообщений
REST API и Admin SDK поддерживают пакетную отправку сообщений. Вы можете сгруппировать до 500 сообщений в один пакет и отправить их все в одном вызове API со значительным улучшением производительности по сравнению с отправкой отдельных HTTP-запросов для каждого сообщения.
Эту функцию можно использовать для создания настраиваемого набора сообщений и отправки их различным получателям, включая темы или маркеры регистрации определенных устройств. Используйте эту функцию, когда, например, вам нужно одновременно отправить сообщения разным аудиториям с немного отличающимися деталями в теле сообщения.
Node.js
// Create a list containing up to 500 messages.
const messages = [];
messages.push({
notification: { title: 'Price drop', body: '5% off all electronics' },
token: registrationToken,
});
messages.push({
notification: { title: 'Price drop', body: '2% off all books' },
topic: 'readers-club',
});
getMessaging().sendAll(messages)
.then((response) => {
console.log(response.successCount + ' messages were sent successfully');
});
Джава
// Create a list containing up to 500 messages.
List<Message> messages = Arrays.asList(
Message.builder()
.setNotification(Notification.builder()
.setTitle("Price drop")
.setBody("5% off all electronics")
.build())
.setToken(registrationToken)
.build(),
// ...
Message.builder()
.setNotification(Notification.builder()
.setTitle("Price drop")
.setBody("2% off all books")
.build())
.setTopic("readers-club")
.build()
);
BatchResponse response = FirebaseMessaging.getInstance().sendAll(messages);
// See the BatchResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " messages were sent successfully");
Питон
# Create a list containing up to 500 messages.
messages = [
messaging.Message(
notification=messaging.Notification('Price drop', '5% off all electronics'),
token=registration_token,
),
# ...
messaging.Message(
notification=messaging.Notification('Price drop', '2% off all books'),
topic='readers-club',
),
]
response = messaging.send_all(messages)
# See the BatchResponse reference documentation
# for the contents of response.
print('{0} messages were sent successfully'.format(response.success_count))
Идти
// Create a list containing up to 500 messages.
messages := []*messaging.Message{
{
Notification: &messaging.Notification{
Title: "Price drop",
Body: "5% off all electronics",
},
Token: registrationToken,
},
{
Notification: &messaging.Notification{
Title: "Price drop",
Body: "2% off all books",
},
Topic: "readers-club",
},
}
br, err := client.SendAll(context.Background(), messages)
if err != nil {
log.Fatalln(err)
}
// See the BatchResponse reference documentation
// for the contents of response.
fmt.Printf("%d messages were sent successfully\n", br.SuccessCount)
С#
// Create a list containing up to 500 messages.
var messages = new List<Message>()
{
new Message()
{
Notification = new Notification()
{
Title = "Price drop",
Body = "5% off all electronics",
},
Token = registrationToken,
},
new Message()
{
Notification = new Notification()
{
Title = "Price drop",
Body = "2% off all books",
},
Topic = "readers-club",
},
};
var response = await FirebaseMessaging.DefaultInstance.SendEachAsync(messages);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");
ОТДЫХ
Создайте пакетный HTTP-запрос, объединив список подзапросов:
--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"FCM Message",
"body":"This is an FCM notification message to device 0!"
}
}
}
--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json
{
"message":{
"topic":"readers-club",
"notification":{
"title":"Price drop",
"body":"2% off all books"
}
}
}
...
--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json
{
"message":{
"token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
"notification":{
"title":"FCM Message",
"body":"This is an FCM notification message to device N!"
}
}
}
--subrequest_boundary--
Вы можете запросить возвращенный BatchResponse
, чтобы проверить, сколько сообщений было успешно передано в FCM. Он также предоставляет список ответов, которые можно использовать для проверки состояния отдельных сообщений. Порядок ответов соответствует порядку сообщений во входном списке.
Отправка прямых сообщений с включенной загрузкой (только для Android)
Вы можете отправлять сообщения на устройства в режиме прямой загрузки, используя HTTP v1 или устаревшие HTTP API. Перед отправкой на устройства в режиме прямой загрузки убедитесь, что вы выполнили шаги, позволяющие клиентским устройствам получать сообщения FCM в режиме прямой загрузки .
Отправить с помощью HTTP API FCM v1
Запрос сообщения должен включать ключ "direct_boot_ok" : true
в параметрах AndroidConfig
тела запроса. Например:
https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
Content-Type:application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
"data": {
"score": "5x1",
"time": "15:10"
},
"android": {
"direct_boot_ok": true,
},
}
Отправка с использованием устаревшего HTTP API FCM
Запрос сообщения должен включать ключ "direct_boot_ok" : true
на верхнем уровне тела запроса. Например:
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
"direct_boot_ok" : true
}
Сообщения, отправленные с этим ключом в теле запроса, могут обрабатываться приложениями на устройствах, которые в данный момент находятся в режиме прямой загрузки (а также когда они не находятся в этом режиме).
Настройте сообщения на разных платформах
Firebase Admin SDK и HTTP-протокол FCM v1 позволяют вашим запросам сообщений устанавливать все поля, доступные в объекте message
. Это включает в себя:
- общий набор полей, которые должны интерпретироваться всеми экземплярами приложения, получающими сообщение.
- специфичные для платформы наборы полей, такие как
AndroidConfig
иWebpushConfig
, которые интерпретируются только экземплярами приложений, работающими на указанной платформе.
Блоки для конкретных платформ позволяют гибко настраивать сообщения для разных платформ, чтобы гарантировать их правильную обработку при получении. Бэкэнд FCM примет во внимание все указанные параметры и настроит сообщение для каждой платформы.
Когда использовать общие поля
Используйте общие поля, когда вы:
- Ориентация на экземпляры приложений на всех платформах — Apple, Android и в Интернете.
- Отправка сообщений в темы
Все экземпляры приложения, независимо от платформы, могут интерпретировать следующие общие поля:
Когда использовать поля для конкретной платформы
Используйте поля для конкретной платформы, если вы хотите:
- Отправка полей только на определенные платформы
- Отправка полей для конкретной платформы в дополнение к общим полям
Всякий раз, когда вы хотите отправлять значения только на определенные платформы, не используйте общие поля; использовать поля, зависящие от платформы. Например, чтобы отправить уведомление только на платформы Apple и в Интернет, но не на Android, необходимо использовать два отдельных набора полей: один для Apple и один для Интернета.
Когда вы отправляете сообщения с определенными параметрами доставки , используйте поля для конкретной платформы, чтобы установить их. Вы можете указать разные значения для каждой платформы, если хотите. Однако даже если вы хотите установить практически одно и то же значение для разных платформ, вы должны использовать поля для конкретных платформ. Это связано с тем, что каждая платформа может интерпретировать это значение немного по-разному — например, время жизни задается в Android как время истечения срока действия в секундах, а в Apple — как дата истечения срока действия.
Пример: уведомление с параметрами цвета и значка
В этом примере запрос на отправку отправляет общий заголовок и содержимое уведомления на все платформы, но также отправляет некоторые переопределения для конкретных платформ на устройства Android.
Для Android запрос устанавливает специальный значок и цвет для отображения на устройствах Android. Как указано в справочнике по AndroidNotification , цвет указывается в формате #rrggbb, а изображение должно быть локальным ресурсом значка, доступным для рисования, для приложения Android.
Вот приблизительный визуальный эффект на устройстве пользователя:
Node.js
const topicName = 'industry-tech';
const message = {
notification: {
title: '`$FooCorp` up 1.43% on the day',
body: 'FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
android: {
notification: {
icon: 'stock_ticker_update',
color: '#7e55c3'
}
},
topic: topicName,
};
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Джава
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle("$GOOG up 1.43% on the day")
.setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
.build())
.setAndroidConfig(AndroidConfig.builder()
.setTtl(3600 * 1000)
.setNotification(AndroidNotification.builder()
.setIcon("stock_ticker_update")
.setColor("#f45342")
.build())
.build())
.setApnsConfig(ApnsConfig.builder()
.setAps(Aps.builder()
.setBadge(42)
.build())
.build())
.setTopic("industry-tech")
.build();
Питон
message = messaging.Message(
notification=messaging.Notification(
title='$GOOG up 1.43% on the day',
body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
),
android=messaging.AndroidConfig(
ttl=datetime.timedelta(seconds=3600),
priority='normal',
notification=messaging.AndroidNotification(
icon='stock_ticker_update',
color='#f45342'
),
),
apns=messaging.APNSConfig(
payload=messaging.APNSPayload(
aps=messaging.Aps(badge=42),
),
),
topic='industry-tech',
)
Идти
oneHour := time.Duration(1) * time.Hour
badge := 42
message := &messaging.Message{
Notification: &messaging.Notification{
Title: "$GOOG up 1.43% on the day",
Body: "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Android: &messaging.AndroidConfig{
TTL: &oneHour,
Notification: &messaging.AndroidNotification{
Icon: "stock_ticker_update",
Color: "#f45342",
},
},
APNS: &messaging.APNSConfig{
Payload: &messaging.APNSPayload{
Aps: &messaging.Aps{
Badge: &badge,
},
},
},
Topic: "industry-tech",
}
С#
var message = new Message
{
Notification = new Notification()
{
Title = "$GOOG up 1.43% on the day",
Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Android = new AndroidConfig()
{
TimeToLive = TimeSpan.FromHours(1),
Notification = new AndroidNotification()
{
Icon = "stock_ticker_update",
Color = "#f45342",
},
},
Apns = new ApnsConfig()
{
Aps = new Aps()
{
Badge = 42,
},
},
Topic = "industry-tech",
};
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic":"industry-tech",
"notification":{
"title":"`$FooCorp` up 1.43% on the day",
"body":"FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day."
},
"android":{
"notification":{
"icon":"stock_ticker_update",
"color":"#7e55c3"
}
}
}
}
Полную информацию о ключах, доступных в блоках для конкретных платформ в теле сообщения, см. в справочной документации по HTTP v1 .
Пример: уведомление с пользовательским изображением
В следующем примере запрос на отправку отправляет общий заголовок уведомления на все платформы, но также отправляет изображение. Вот приблизительный визуальный эффект на устройстве пользователя:
Node.js
const topicName = 'industry-tech';
const message = {
notification: {
title: 'Sparky says hello!'
},
android: {
notification: {
imageUrl: 'https://foo.bar.pizza-monster.png'
}
},
apns: {
payload: {
aps: {
'mutable-content': 1
}
},
fcm_options: {
image: 'https://foo.bar.pizza-monster.png'
}
},
webpush: {
headers: {
image: 'https://foo.bar.pizza-monster.png'
}
},
topic: topicName,
};
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic":"industry-tech",
"notification":{
"title":"Sparky says hello!",
},
"android":{
"notification":{
"image":"https://foo.bar/pizza-monster.png"
}
},
"apns":{
"payload":{
"aps":{
"mutable-content":1
}
},
"fcm_options": {
"image":"https://foo.bar/pizza-monster.png"
}
},
"webpush":{
"headers":{
"image":"https://foo.bar/pizza-monster.png"
}
}
}
}
Полную информацию о ключах, доступных в блоках для конкретных платформ в теле сообщения, см. в справочной документации по HTTP v1 .
Пример: сообщение уведомления с соответствующим действием щелчка
В следующем примере запрос на отправку отправляет общий заголовок уведомления на все платформы, но также отправляет действие, которое приложение должно выполнить в ответ на взаимодействие пользователя с уведомлением. Вот приблизительный визуальный эффект на устройстве пользователя:
Node.js
const topicName = 'industry-tech';
const message = {
notification: {
title: 'Breaking News....'
},
android: {
notification: {
clickAction: 'news_intent'
}
},
apns: {
payload: {
aps: {
'category': 'INVITE_CATEGORY'
}
}
},
webpush: {
fcmOptions: {
link: 'breakingnews.html'
}
},
topic: topicName,
};
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic":"industry-tech",
"notification":{
"title":"Breaking News...",
},
"android":{
"notification":{
"click_action":"news_intent"
}
},
"apns":{
"payload":{
"aps":{
"category" : "INVITE_CATEGORY"
}
},
},
"webpush":{
"fcm_options":{
"link":"breakingnews.html"
}
}
}
}
Полную информацию о ключах, доступных в блоках для конкретных платформ в теле сообщения, см. в справочной документации по HTTP v1 .
Пример: уведомление с параметрами локализации
В следующем примере запрос на отправку отправляет параметры локализации клиенту для отображения локализованных сообщений. Вот приблизительный визуальный эффект на устройстве пользователя:
Node.js
var topicName = 'industry-tech';
var message = {
android: {
ttl: 3600000,
notification: {
bodyLocKey: 'STOCK_NOTIFICATION_BODY',
bodyLocArgs: ['FooCorp', '11.80', '835.67', '1.43']
}
},
apns: {
payload: {
aps: {
alert: {
locKey: 'STOCK_NOTIFICATION_BODY',
locArgs: ['FooCorp', '11.80', '835.67', '1.43']
}
}
}
},
topic: topicName,
};
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
ОТДЫХ
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic":"Tech",
"android":{
"ttl":"3600s",
"notification":{
"body_loc_key": "STOCK_NOTIFICATION_BODY",
"body_loc_args": ["FooCorp", "11.80", "835.67", "1.43"],
},
},
"apns":{
"payload":{
"aps":{
"alert" : {
"loc-key": "STOCK_NOTIFICATION_BODY",
"loc-args": ["FooCorp", "11.80", "835.67", "1.43"],
},
},
},
},
},
}'
Полную информацию о ключах, доступных в блоках для конкретных платформ в теле сообщения, см. в справочной документации по HTTP v1 .
Коды ошибок администратора
В следующей таблице перечислены коды ошибок Firebase Admin FCM API и их описания, включая рекомендуемые действия по устранению.
Код ошибки | Описание и шаги решения |
---|---|
messaging/invalid-argument | Методу FCM был предоставлен недопустимый аргумент. Сообщение об ошибке должно содержать дополнительную информацию. |
messaging/invalid-recipient | Предполагаемый получатель сообщения недействителен. Сообщение об ошибке должно содержать дополнительную информацию. |
messaging/invalid-payload | Предоставлен недопустимый объект полезной нагрузки сообщения. Сообщение об ошибке должно содержать дополнительную информацию. |
messaging/invalid-data-payload-key | Полезная нагрузка сообщения данных содержит недопустимый ключ. См. справочную документацию для DataMessagePayload для ограниченных ключей. |
messaging/payload-size-limit-exceeded | Предоставленная полезная нагрузка сообщения превышает ограничения размера FCM. Ограничение составляет 4096 байт для большинства сообщений. Для сообщений, отправляемых в темы, ограничение составляет 2048 байт. Общий размер полезной нагрузки включает как ключи, так и значения. |
messaging/invalid-options | Предоставлен недопустимый объект параметров сообщения. Сообщение об ошибке должно содержать дополнительную информацию. |
messaging/invalid-registration-token | Предоставлен недействительный токен регистрации. Убедитесь, что он соответствует токену регистрации, который клиентское приложение получает при регистрации в FCM. Не усекайте и не добавляйте к нему дополнительные символы. |
messaging/registration-token-not-registered | Предоставленный токен регистрации не зарегистрирован. Ранее действующий токен регистрации может быть отменен по разным причинам, в том числе:
|
messaging/invalid-package-name | Сообщение было адресовано токену регистрации, имя пакета которого не соответствует указанному параметру restrictedPackageName . |
messaging/message-rate-exceeded | Скорость сообщений для конкретной цели слишком высока. Сократите количество сообщений, отправляемых на это устройство или в тему, и не повторяйте сразу же отправку на эту цель. |
messaging/device-message-rate-exceeded | Скорость отправки сообщений на конкретное устройство слишком высока. Сократите количество сообщений, отправляемых на это устройство, и не пытайтесь немедленно отправить их на это устройство. |
messaging/topics-message-rate-exceeded | Скорость отправки сообщений подписчикам той или иной темы слишком высока. Сократите количество сообщений, отправляемых в эту тему, и не повторяйте сразу же отправку в эту тему. |
messaging/too-many-topics | Токен регистрации был подписан на максимальное количество тем и больше не может быть подписан. |
messaging/invalid-apns-credentials | Сообщение, предназначенное для устройства Apple, не может быть отправлено, так как требуемый сертификат SSL APNs не был загружен или срок его действия истек. Проверьте действительность ваших сертификатов разработки и производства. |
messaging/mismatched-credential | Учетные данные, используемые для проверки подлинности этого пакета SDK, не имеют разрешения на отправку сообщений на устройство, соответствующее предоставленному токену регистрации. Убедитесь, что учетные данные и токен регистрации принадлежат одному и тому же проекту Firebase. См. раздел Добавление Firebase в ваше приложение для получения документации о том, как аутентифицировать Firebase Admin SDK. |
messaging/authentication-error | SDK не удалось пройти аутентификацию на серверах FCM. Убедитесь, что вы аутентифицируете Firebase Admin SDK с учетными данными, которые имеют соответствующие разрешения для отправки сообщений FCM. См. раздел Добавление Firebase в ваше приложение для получения документации о том, как аутентифицировать Firebase Admin SDK. |
messaging/server-unavailable | Сервер FCM не смог вовремя обработать запрос. Вы должны повторить тот же запрос, но вы должны:
|
messaging/internal-error | Сервер FCM обнаружил ошибку при попытке обработать запрос. Вы можете повторить тот же запрос, следуя требованиям, перечисленным в строке messaging/server-unavailable выше. Если ошибка не устранена, сообщите о проблеме в наш канал поддержки отчетов об ошибках . |
messaging/unknown-error | Возвращена неизвестная ошибка сервера. Дополнительные сведения см. в необработанном ответе сервера в сообщении об ошибке. Если вы получили эту ошибку, сообщите полное сообщение об ошибке на наш канал поддержки отчетов об ошибках . |
Отправляйте сообщения, используя устаревшие протоколы сервера приложений.
Если вы в настоящее время используете устаревшие протоколы, создайте запросы сообщений, как показано в этом разделе. Имейте в виду, что если вы отправляете на несколько платформ через HTTP, протокол v1 может значительно упростить ваши запросы сообщений.
Отправка сообщений на определенные устройства
Чтобы отправлять сообщения на определенные устройства, задайте to
ключа to токен регистрации для конкретного экземпляра приложения. См. информацию о настройке клиента для вашей платформы, чтобы узнать больше о токенах регистрации.
POST-запрос HTTP
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
HTTP-ответ
{ "multicast_id": 108, "success": 1, "failure": 0, "results": [ { "message_id": "1:08" } ] }
XMPP-сообщение
<message id="">
<gcm xmlns="google:mobile:data">
{ "data": {
"score": "5x1",
"time": "15:10"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
</gcm>
</message>
XMPP-ответ
<message id=""> <gcm xmlns="google:mobile:data"> { "from":"REGID", "message_id":"m-1366082849205" "message_type":"ack" } </gcm> </message>
Сервер соединений XMPP предоставляет некоторые другие варианты ответов. См. Формат ответа сервера .
Полный список параметров сообщений, доступных при отправке нисходящих сообщений клиентским приложениям, см. в справочной информации для выбранного вами протокола сервера подключения, HTTP или XMPP .
Отправляйте сообщения в темы
Отправка сообщений в тему Firebase Cloud Messaging очень похожа на отправку сообщений на отдельное устройство или группе пользователей. Сервер приложений устанавливает для ключа to
значение, подобное /topics/yourTopic
. Разработчики могут выбрать любое название темы, соответствующее регулярному выражению: "/topics/[a-zA-Z0-9-_.~%]+"
.
Чтобы отправить в комбинации нескольких тем, сервер приложений должен установить для ключа condition
(вместо ключа to
) логическое условие, указывающее целевые темы. Например, чтобы отправлять сообщения на устройства, которые подписались на TopicA
и либо TopicB
, либо на TopicC
:
'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)
FCM сначала оценивает любые условия в круглых скобках, а затем вычисляет выражение слева направо. В приведенном выше выражении пользователь, подписанный на какую-либо отдельную тему, не получает сообщение. Точно так же пользователь, не подписанный на TopicA, не получит сообщение. Эти комбинации действительно получают его:
- Тема А и Тема Б
- Тема А и Тема С
В условное выражение можно включить до пяти разделов, поддерживаются круглые скобки. Поддерживаемые операторы: &&
, ||
.
Тема HTTP POST-запрос
Отправить в одну тему:
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
Отправлять на устройства, подписанные на темы "собаки" или "кошки":
https://fcm.googleapis.com/fcm/send Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
HTTP-ответ темы
//Success example: { "message_id": "1023456" } //failure example: { "error": "TopicsMessageRateExceeded" }
XMPP-сообщение темы
Отправить в одну тему:
<message id="">
<gcm xmlns="google:mobile:data">
</gcm>
</message>
Отправлять на устройства, подписанные на темы "собаки" или "кошки":
<message id=""> <gcm xmlns="google:mobile:data"> </gcm> </message>
Тема XMPP ответ
//Success example: { "message_id": "1023456" } //failure example: { "error": "TopicsMessageRateExceeded" }
Ожидайте задержку до 30 секунд, прежде чем сервер FCM вернет ответ об успешном или неудачном завершении на запросы отправки темы. Обязательно установите значение тайм-аута сервера приложений в запросе соответствующим образом.
Отправка сообщений группам устройств
Отправка сообщений группе устройств с использованием устаревших устаревших API очень похожа на отправку сообщений на отдельное устройство. Задайте to
параметра 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 токена регистрации. Сообщение было успешно отправлено только на 1 из токенов регистрации. В ответном сообщении перечислены токены регистрации ( 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 регистрационных токена, и сообщение было успешно отправлено на все из них:
{ "from": "aUniqueKey", "message_type": "ack", "success": 3, "failure": 0, "message_id": "m-1366082849205" }
Вот пример «частичного успеха» — с notification_key
связаны 3 токена регистрации. Сообщение было успешно отправлено только на 1 из токенов регистрации. В ответном сообщении перечислены токены регистрации, которым не удалось получить сообщение:
{ "from": "aUniqueKey", "message_type": "ack", "success":1, "failure":2, "failed_registration_ids":[ "regId1", "regId2" ] }
Когда серверу соединений FCM не удается доставить сообщение на все устройства в группе. Сервер приложений получит ответ nack.
Полный список параметров сообщения см. в справочной информации для выбранного вами протокола сервера соединений, HTTP или XMPP .
Устаревшие методы отправки Firebase Admin SDK
SDK Firebase Admin Node.js поддерживает методы отправки (FCM) сообщений на основе устаревшего API сервера FCM . Эти методы принимают другие аргументы по сравнению с методом send()
. Вы должны использовать метод send()
везде, где это возможно, и использовать методы, описанные на этой странице, только при отправке сообщений на отдельные устройства или группы устройств.
Отправить на отдельные устройства
Вы можете передать токен регистрации методу sendToDevice()
, чтобы отправить сообщение на это устройство:
Node.js
// This registration token comes from the client FCM SDKs.
const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';
// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
data: {
score: '850',
time: '2:45'
}
};
// Send a message to the device corresponding to the provided
// registration token.
getMessaging().sendToDevice(registrationToken, payload)
.then((response) => {
// See the MessagingDevicesResponse reference documentation for
// the contents of response.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Метод sendToDevice()
также может отправлять многоадресное сообщение (то есть сообщение на несколько устройств), передавая массив регистрационных токенов вместо одного регистрационного токена:
Node.js
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...',
// ...
'ecupwIfBy1w:APA91bFtuMY7MktgxA3Au_Qx7cKqnf...'
];
// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
data: {
score: '850',
time: '2:45'
}
};
// Send a message to the devices corresponding to the provided
// registration tokens.
getMessaging().sendToDevice(registrationTokens, payload)
.then((response) => {
// See the MessagingDevicesResponse reference documentation for
// the contents of response.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Метод sendToDevice()
возвращает обещание, которое разрешается с помощью объекта MessagingDevicesResponse
, содержащего ответ от FCM. Тип возвращаемого значения имеет тот же формат при передаче одного маркера регистрации или массива маркеров регистрации.
В некоторых случаях, таких как ошибка аутентификации или ограничение скорости, сообщение не может быть обработано целиком. В этих случаях обещание, возвращаемое функцией sendToDevice()
, отклоняется с ошибкой. Полный список кодов ошибок, включая описания и действия по их устранению, см. в разделе Ошибки Admin FCM API .
Отправить в группу устройств
Метод sendToDeviceGroup()
позволяет отправить сообщение группе устройств, указав ключ уведомления для этой группы устройств:
Node.js
// See the "Managing device groups" link above on how to generate a
// notification key.
const notificationKey = 'some-notification-key';
// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
data: {
score: '850',
time: '2:45'
}
};
// Send a message to the device group corresponding to the provided
// notification key.
getMessaging().sendToDeviceGroup(notificationKey, payload)
.then((response) => {
// See the MessagingDeviceGroupResponse reference documentation for
// the contents of response.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
Метод sendToDeviceGroup()
возвращает обещание, которое разрешается с помощью объекта MessagingDevicesResponse
, содержащего ответ от FCM.
В некоторых случаях, таких как ошибка аутентификации или ограничение скорости, сообщение не может быть обработано целиком. В этих случаях обещание, возвращаемое функцией sendToDeviceGroup()
, отклоняется с ошибкой. Полный список кодов ошибок, включая описания и действия по их устранению, см. в разделе Ошибки Admin FCM API .
Определение полезной нагрузки сообщения
Вышеупомянутые методы, основанные на устаревших протоколах FCM, принимают полезную нагрузку сообщения в качестве второго аргумента и поддерживают как уведомления, так и сообщения данных . Вы можете указать один или оба типа сообщений, создав объект с ключами data
и/или notification
. Например, вот как определить различные типы полезной нагрузки сообщений:
Уведомление
const payload = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
}
};
Сообщение данных
const payload = {
data: {
score: '850',
time: '2:45'
}
};
Комбинированное сообщение
const payload = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
data: {
stock: 'GOOG',
open: '829.62',
close: '635.67'
}
};
Полезные данные сообщения уведомления имеют предопределенный подмножество допустимых свойств и немного различаются в зависимости от того, на какую мобильную операционную систему вы ориентируетесь. Полный список см. в справочных документах для NotificationMessagePayload
.
Полезные нагрузки сообщения данных состоят из настраиваемых пар ключ-значение с некоторыми ограничениями, включая тот факт, что все значения должны быть строками. Полный список ограничений см. в справочной документации для DataMessagePayload
.
Определение параметров сообщения
Вышеупомянутые методы, основанные на устаревших протоколах FCM, принимают необязательный третий аргумент, определяющий некоторые параметры сообщения. Например, в следующем примере на устройство отправляется сообщение с высоким приоритетом, срок действия которого истекает через 24 часа:
Node.js
// This registration token comes from the client FCM SDKs.
const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';
// See the "Defining the message payload" section above for details
// on how to define a message payload.
const payload = {
notification: {
title: 'Urgent action needed!',
body: 'Urgent action is needed to prevent your account from being disabled!'
}
};
// Set the message as high priority and have it expire after 24 hours.
const options = {
priority: 'high',
timeToLive: 60 * 60 * 24
};
// Send a message to the device corresponding to the provided
// registration token with the provided options.
getMessaging().sendToDevice(registrationToken, payload, options)
.then((response) => {
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
См. справочные документы для MessagingOptions
для получения полного списка доступных параметров.