Создание запросов на отправку сервера приложений

Используя 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"
      }
   }
}

команда cURL:

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"
      }
   }
}

команда cURL:

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",
    }
  }
}

команда cURL:

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

Отправьте пакет сообщений

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");

Отправка прямых сообщений с включенной загрузкой (только для Android)

Вы можете отправлять сообщения на устройства в режиме прямой загрузки, используя HTTP v1 или устаревшие API-интерфейсы HTTP. Перед отправкой на устройства в режиме прямой загрузки убедитесь, что вы выполнили действия, позволяющие клиентским устройствам получать сообщения 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 .

Коды ошибок REST для API HTTP v1

Ответы об ошибках HTTP для API HTTP v1 содержат код ошибки, сообщение об ошибке и статус ошибки. Они также могут содержать массив details с более подробной информацией об ошибке.

Вот два примера ответов об ошибках:

Пример 1. Ответ об ошибке на запрос API HTTP v1 с недопустимым значением в сообщении данных.

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "message.data[0].value",
            "description": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12"
          }
        ]
      }
    ]
  }
}

Пример 2. Ответ об ошибке на запрос API HTTP v1 с недействительным токеном регистрации.

{
  "error": {
    "code": 400,
    "message": "The registration token is not a valid FCM registration token",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.firebase.fcm.v1.FcmError",
        "errorCode": "INVALID_ARGUMENT"
      }
    ]
   }
}

Обратите внимание, что оба сообщения имеют одинаковый код и статус, но массив сведений содержит значения разных типов. Первый пример имеет тип type.googleapis.com/google.rpc.BadRequest , что указывает на ошибку в значениях запроса. Во втором примере с типом type.googleapis.com/google.firebase.fcm.v1.FcmError имеется ошибка, специфичная для FCM. Для многих ошибок массив сведений содержит информацию, необходимую для отладки и поиска решения.

В следующей таблице перечислены коды ошибок REST API FCM v1 и их описания.

Код ошибки Описание и шаги решения
UNSPECIFIED_ERROR Дополнительной информации об этой ошибке нет. Никто.
INVALID_ARGUMENT (код ошибки HTTP = 400) Параметры запроса недействительны. Расширение типа google.rpc.BadRequest возвращается, чтобы указать, какое поле было недействительным. Возможные причины: неверная регистрация, недопустимое имя пакета, слишком большое сообщение, неверный ключ данных, неверный срок жизни или другие недопустимые параметры.
Неверная регистрация : проверьте формат регистрационного токена, который вы передаете на сервер. Убедитесь, что он соответствует регистрационному токену, который клиентское приложение получает при регистрации в FCM. Не обрезайте токен и не добавляйте дополнительные символы.
Недопустимое имя пакета . Убедитесь, что сообщение было адресовано регистрационному токену, имя пакета которого соответствует значению, переданному в запросе.
Сообщение слишком большое : убедитесь, что общий размер полезных данных, включенных в сообщение, не превышает ограничения FCM: 4096 байт для большинства сообщений или 2048 байт в случае сообщений в темах. Сюда входят как ключи, так и значения.
Неверный ключ данных . Убедитесь, что полезные данные не содержат ключ (например, from, gcm или любое значение с префиксом Google), который используется внутри FCM. Обратите внимание, что некоторые слова (например, свернуть_ключ) также используются FCM, но разрешены в полезных данных, и в этом случае значение полезных данных будет переопределено значением FCM.
Неверный срок жизни : убедитесь, что значение, используемое в сроке жизни, является целым числом, представляющим продолжительность в секундах от 0 до 2 419 200 (4 недели).
Недопустимые параметры . Убедитесь, что предоставленные параметры имеют правильное имя и тип.
UNREGISTERED (код ошибки HTTP = 404). Экземпляр приложения не зарегистрирован в FCM. Обычно это означает, что используемый токен больше не действителен и необходимо использовать новый. Эта ошибка может быть вызвана отсутствием токенов регистрации или незарегистрированными токенами.
Отсутствует регистрация . Если целью сообщения является значение token , убедитесь, что запрос содержит токен регистрации.
Не зарегистрировано : существующий регистрационный токен может перестать быть действительным в ряде сценариев, в том числе:
- Если клиентское приложение отменяет регистрацию в FCM.
- Если регистрация клиентского приложения автоматически отменяется, что может произойти, если пользователь удалит приложение. Например, в iOS, если служба обратной связи APNs сообщила, что токен APNs недействителен.
– Если срок действия токена регистрации истек (например, Google может принять решение обновить токены регистрации или срок действия токена APNs истек для устройств iOS).
- Если клиентское приложение обновлено, но новая версия не настроена на получение сообщений.
Во всех этих случаях удалите этот регистрационный токен с сервера приложений и прекратите использовать его для отправки сообщений.
SENDER_ID_MISMATCH (код ошибки HTTP = 403) Идентификатор проверенного отправителя отличается от идентификатора отправителя для токена регистрации. Регистрационный токен привязан к определенной группе отправителей. Когда клиентское приложение регистрируется в FCM, оно должно указать, каким отправителям разрешено отправлять сообщения. Вам следует использовать один из этих идентификаторов отправителя при отправке сообщений в клиентское приложение. Если вы переключитесь на другого отправителя, существующие регистрационные токены не будут работать.
QUOTA_EXCEEDED (код ошибки HTTP = 429) Превышен лимит отправки для целевого сообщения. Расширение типа google.rpc.QuotaFailure возвращается, чтобы указать, какая квота была превышена. Эта ошибка может быть вызвана превышением квоты скорости сообщения, превышением квоты скорости сообщения устройства или превышением квоты скорости сообщения темы.
Превышена скорость передачи сообщений : Скорость отправки сообщений слишком высока. Вы должны снизить общую скорость отправки сообщений. Используйте экспоненциальную отсрочку с минимальной начальной задержкой в ​​1 минуту для повторной попытки отклоненных сообщений.
Превышена частота сообщений устройства : Скорость сообщений на конкретное устройство слишком высока. См. ограничение скорости передачи сообщений для одного устройства . Уменьшите количество сообщений, отправляемых на это устройство, и используйте экспоненциальную отсрочку для повторной отправки.
Превышена частота сообщений по теме : Частота сообщений подписчикам по определенной теме слишком высока. Уменьшите количество сообщений, отправляемых по этой теме, и используйте экспоненциальную задержку с минимальной начальной задержкой в ​​1 минуту для повторной отправки.
UNAVAILABLE (код ошибки HTTP = 503) Сервер перегружен. Сервер не смог вовремя обработать запрос. Повторите тот же запрос, но необходимо:
— Учитывайте заголовок Retry-After, если он включен в ответ сервера соединений FCM.
- Внедрите экспоненциальную отсрочку в механизме повторных попыток. (например, если вы подождали одну секунду перед первой повторной попыткой, подождите не менее двух секунд перед следующей, затем 4 секунды и так далее). Если вы отправляете несколько сообщений, рассмотрите возможность применения дрожания. Дополнительные сведения см. в разделе Обработка повторных попыток . Отправители, вызывающие проблемы, рискуют попасть в список запрещенных.
INTERNAL (код ошибки HTTP = 500) Произошла неизвестная внутренняя ошибка. Сервер обнаружил ошибку при попытке обработать запрос. Вы можете повторить тот же запрос, следуя рекомендациям в разделе «Обработка повторных попыток» . Если ошибка не исчезнет, ​​обратитесь в службу поддержки Firebase.
THIRD_PARTY_AUTH_ERROR (код ошибки HTTP = 401) Сертификат APN или ключ аутентификации через веб-приложение недействительны или отсутствуют. Не удалось отправить сообщение, предназначенное для устройства iOS, или веб-приложение. Проверьте действительность своих учетных данных для разработки и производства.

Коды ошибок администратора

В следующей таблице перечислены коды ошибок 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 Предоставленный регистрационный токен не зарегистрирован. Ранее действующий регистрационный токен может быть отменен по ряду причин, в том числе:
  • Клиентское приложение отменило регистрацию в FCM.
  • Клиентское приложение было автоматически отменено. Это может произойти, если пользователь удаляет приложение или, на платформах Apple, если служба обратной связи APNs сообщает, что токен APNs недействителен.
  • Срок действия регистрационного токена истек. Например, Google может принять решение обновить регистрационные токены или срок действия токена APNs для устройств Apple может быть истек.
  • Клиентское приложение было обновлено, но новая версия не настроена на получение сообщений.
Во всех этих случаях удалите этот регистрационный токен и прекратите использовать его для отправки сообщений.
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-сертификат APN не был загружен или срок его действия истек. Проверьте действительность ваших сертификатов разработки и производства.
messaging/mismatched-credential Учетные данные, используемые для аутентификации этого пакета SDK, не имеют разрешения на отправку сообщений на устройство, соответствующее предоставленному регистрационному токену. Убедитесь, что учетные данные и токен регистрации принадлежат одному и тому же проекту Firebase. См. документацию по аутентификации SDK администратора Firebase в разделе «Добавление Firebase в ваше приложение» .
messaging/authentication-error SDK не смог пройти аутентификацию на серверах FCM. Убедитесь, что вы аутентифицируете Firebase Admin SDK с помощью учетных данных, которые имеют необходимые разрешения для отправки сообщений FCM. См. документацию по аутентификации SDK администратора Firebase в разделе «Добавление Firebase в ваше приложение» .
messaging/server-unavailable Сервер FCM не смог вовремя обработать запрос. Вам следует повторить тот же запрос, но вы должны:
  • Учитывайте заголовок Retry-After , если он включен в ответ сервера соединений FCM.
  • Внедрите экспоненциальную отсрочку в механизме повторных попыток. Например, если вы подождали одну секунду перед первой повторной попыткой, подождите не менее двух секунд перед следующей, затем четыре секунды и так далее. Если вы отправляете несколько сообщений, задержите каждое из них независимо на дополнительную случайную величину, чтобы избежать одновременной отправки нового запроса для всех сообщений.
Отправители, вызывающие проблемы, рискуют попасть в черный список.
messaging/internal-error Сервер FCM обнаружил ошибку при попытке обработать запрос. Вы можете повторить тот же запрос, следуя требованиям, перечисленным в строке messaging/server-unavailable выше. Если ошибка не устранена, сообщите о проблеме в наш канал поддержки отчетов об ошибках .
messaging/unknown-error Возвращена неизвестная ошибка сервера. Дополнительные сведения см. в необработанном ответе сервера в сообщении об ошибке. Если вы получили эту ошибку, сообщите полное сообщение об ошибке в наш канал поддержки отчетов об ошибках .

Отправляйте сообщения, используя устаревшие протоколы сервера приложений.

Если вы в настоящее время используете устаревшие протоколы, создайте запросы сообщений, как показано в этом разделе. Имейте в виду, что если вы отправляете сообщения на несколько платформ через HTTP, протокол v1 может значительно упростить ваши запросы сообщений.

Отправка сообщений на определенные устройства

Чтобы отправлять сообщения на определенные устройства, установите ключ to для токена регистрации для конкретного экземпляра приложения. См. информацию о настройке клиента для вашей платформы, чтобы узнать больше о регистрационных токенах.

HTTP POST-запрос

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, не получит сообщение. Эти комбинации получают его:

  • Тема А и Тема Б
  • ТемаA и ТемаC

В условное выражение можно включить до пяти тем, поддерживаются круглые скобки. Поддерживаемые операторы: && , || .

Тема 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 регистрационных токена. Сообщение было успешно отправлено только на один из регистрационных токенов. В ответном сообщении перечислены токены регистрации ( 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 отвечает подтверждением. Если все сообщения, отправленные на все устройства в группе, завершаются неудачей, сервер соединений XMPP отвечает NACK.

Вот пример «успеха» — с notification_key связано 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 .

Устаревшие методы отправки Firebase Admin SDK

Firebase Admin Node.js SDK поддерживает методы отправки сообщений (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() отклоняется с ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API FCM администратора» .

Отправить в группу устройств

Метод 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() отклоняется с ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API FCM администратора» .

Определение полезной нагрузки сообщения

Вышеупомянутые методы, основанные на устаревших протоколах 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 .

,

Используя 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"
      }
   }
}

команда cURL:

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"
      }
   }
}

команда cURL:

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",
    }
  }
}

команда cURL:

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

Отправьте пакет сообщений

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");

Отправка прямых сообщений с включенной загрузкой (только для Android)

Вы можете отправлять сообщения на устройства в режиме прямого загрузки, используя API HTTP V1 или Legacy HTTP. Перед отправкой на устройства в режиме прямого загрузки убедитесь, что вы выполнили шаги, чтобы разрешить клиентские устройства получать сообщения FCM в режиме прямого загрузки .

Отправить с помощью API FCM V1 HTTP

Запрос сообщения должен включать ключ "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,
    },
}

Отправить с помощью FCM Legacy HTTP API

Запрос сообщения должен включать ключ "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
}

Сообщения, отправляемые с этим ключом в корпусе запроса, могут быть обработаны приложениями на устройствах, которые в настоящее время находятся в режиме прямого загрузки (а также в этом режиме).

Настроить сообщения на разных платформах

Admin SDK Firebase и протокол FCM V1 HTTP позволяют вашему сообщению устанавливать все поля, доступные в объекте message . Это включает в себя:

  • Общий набор полей, которые будут интерпретированы всеми экземплярами приложений, которые получают сообщение.
  • Платформа, набор полей, таких как AndroidConfig и WebpushConfig , интерпретируемые только экземплярами приложений, работающих на указанной платформе.

Блоки для конкретной платформы дают вам гибкость для настройки сообщений для различных платформ, чтобы убедиться, что они обрабатываются правильно при получении. Бэкэнд FCM будет учитывать все указанные параметры и настраивать сообщение для каждой платформы.

Когда использовать общие поля

Используйте общие поля, когда вы:

  • Нацеливание на экземпляры приложений на всех платформах - Apple, Android и Web
  • Отправка сообщений на темы

Все экземпляры приложений, независимо от платформы, могут интерпретировать следующие общие поля:

Когда использовать поля для конкретных платформ

Используйте поля, специфичные для платформы, когда вы хотите:

  • Отправить поля только на определенные платформы
  • Отправить поля для конкретной платформы в дополнение к общим полям

Всякий раз, когда вы хотите отправлять значения только на определенные платформы, не используйте общие поля; Используйте поля для конкретных платформ. Например, чтобы отправить уведомление только на платформы 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 для получения полной информации о ключах, доступных в блоках для конкретных платформ в теле сообщений.

Коды ошибок отдыха для API HTTP V1

Ответы по ошибкам HTTP для API HTTP V1 содержат код ошибки, сообщение об ошибке и статус ошибки. Они также могут содержать массив details с более подробной информацией об ошибке.

Вот два ответа на ошибку образца:

Пример 1: Ответ об ошибке из запроса API HTTP V1 с неверным значением в сообщении данных

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "message.data[0].value",
            "description": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12"
          }
        ]
      }
    ]
  }
}

Пример 2: Ответ об ошибке из запроса API HTTP V1 с неверным токеном регистрации

{
  "error": {
    "code": 400,
    "message": "The registration token is not a valid FCM registration token",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.firebase.fcm.v1.FcmError",
        "errorCode": "INVALID_ARGUMENT"
      }
    ]
   }
}

Обратите внимание, что оба сообщения имеют одинаковый код и статус, но массив деталей содержит значения в разных типах. Первый пример имеет тип type.googleapis.com/google.rpc.BadRequest , указывающий ошибку в значениях запроса. Второй пример с типом type.googleapis.com/google.firebase.fcm.v1.FcmError имеет ошибку FCM. Для многих ошибок массив деталей содержит информацию, которая вам необходима для отладки, и найти разрешение.

В следующей таблице перечислены коды ошибок API FCM V1 REST и их описания.

Код ошибки Шаги описания и разрешения
UNSPECIFIED_ERROR Нет больше информации об этой ошибке. Никто.
INVALID_ARGUMENT (код ошибки http = 400) Параметры запроса были недействительными. Расширение типа google.rpc.BadRequest возвращается, чтобы указать, какое поле было недействительным. Потенциальные причины включают в себя недействительную регистрацию, неверное имя пакета, слишком большое сообщение, неверный ключ данных, неверный TTL или другие неверные параметры.
Неверная регистрация : проверьте формат токена регистрации, который вы передаете на сервер. Убедитесь, что он соответствует токену регистрации, который клиентский приложение получает от регистрации в FCM. Не укройте токен и не добавляйте дополнительных символов.
Недопустимое имя пакета : убедитесь, что сообщение было адресовано токеном регистрации, имя пакета, имя пакета соответствует значению, передаваемому в запросе.
Сообщение Слишком большое : Убедитесь, что общий размер данных о полезной нагрузке, включенных в сообщение, не превышает пределов FCM: 4096 байтов для большинства сообщений или 2048 байтов в случае сообщений по темам. Это включает в себя как ключи, так и значения.
Неверный ключ данных : проверьте, что данные полезной нагрузки не содержат ключа (например, от или GCM, или любого значения, префиксированного Google), который используется внутри FCM. Обратите внимание, что некоторые слова (такие как collapsse_key) также используются FCM, но разрешены в полезной нагрузке, и в этом случае значение полезной нагрузки будет переопределено значением FCM.
Неверный TTL : проверьте, что значение, используемое в TTL, представляет собой целое число, представляющее продолжительность за несколько секунд от 0 до 2419 200 (4 недели).
Неверные параметры : Убедитесь, что предоставленные параметры имеют правильное имя и тип.
UNREGISTERED (http -код ошибки = 404) экземпляр приложения был незарегистрирован от FCM. Обычно это означает, что используемый токен больше не является действительным, и необходимо использовать новый. Эта ошибка может быть вызвана отсутствующими токенами регистрации или незарегистрированными токенами.
Отсутствие регистрации : если цель сообщения является значением token , убедитесь, что запрос содержит токен регистрации.
Не зарегистрирован : существующий регистрационный токен может перестать быть действительным в ряде сценариев, включая:
- Если клиентское приложение нерегистрирует с FCM.
- Если клиентское приложение автоматически нерегистрировано, что может произойти, если пользователь удаляет приложение. Например, на iOS, если служба обратной связи APNS сообщила о токене APNS как недействительным.
- Если истекает токен регистрации (например, Google может решить обновить токены регистрации, или токен APNS истек для устройств iOS).
- Если клиентское приложение обновляется, но новая версия не настроена на получение сообщений.
Для всех этих случаев удалите этот токен регистрации с сервера приложений и прекратите использование его для отправки сообщений.
SENDER_ID_MISMATCH (код ошибки http = 403) Аутентифицированный идентификатор отправителя отличается от идентификатора отправителя для токена регистрации. Регистрационный токен связан с определенной группой отправителей. Когда клиентское приложение регистрируется для FCM, оно должно указать, каким отправителям разрешено отправлять сообщения. Вы должны использовать один из этих идентификаторов отправителя при отправке сообщений в клиентское приложение. Если вы переключитесь на другого отправителя, существующие токены регистрации не будут работать.
QUOTA_EXCEEDED (HTTP -код ошибки = 429) Отправка лимита превышена для цели сообщения. Расширение типа google.rpc.QuotaFailure возвращается, чтобы указать, какая квота была превышена. Эта ошибка может быть вызвана превышенной квотой скорости сообщений, превышенной квотой скорости сообщений устройства или превышенной квотой скорости тематических сообщений.
Скорость сообщений превышала : скорость отправки сообщений слишком высока. Вы должны снизить общую ставку, с которой вы отправляете сообщения. Используйте экспоненциальный откат с минимальной начальной задержкой в ​​1 минуту для повторения отклоненных сообщений.
Скорость сообщений устройства превышала : скорость сообщений на конкретное устройство слишком высока. См. Ограничение скорости сообщений на одно устройство . Уменьшите количество сообщений, отправленных на это устройство, и используйте экспоненциальный откат, чтобы повторно отправить отправку.
Скорость тематических сообщений превышена : скорость сообщений подписчикам на определенную тему слишком высока. Уменьшите количество сообщений, отправленных по этой теме, и используйте экспоненциальный откат с минимальной начальной задержкой в ​​1 минуту для повторения отправки.
UNAVAILABLE (код ошибки http = 503) Сервер перегружен. Сервер не мог обработать запрос вовремя. Повторно повторить тот же запрос, но вы должны:
- Почитайте заголовок повторного перерыва, если он включен в ответ с сервера соединений FCM.
- Реализуйте экспоненциальный отступление в вашем механизме повторной попытки. (Например, если вы ждали одну секунду перед первой попыткой, подождите как минимум за две секунды до следующей, затем 4 секунды и так далее). Если вы отправляете несколько сообщений, рассмотрите возможность применения дрожания. Для получения дополнительной информации см. Обработка повторений . Отправители, которые вызывают проблемы, рискуют быть отклоненными.
INTERNAL (HTTP -код ошибки = 500) произошла неизвестная внутренняя ошибка. Сервер столкнулся с ошибкой при попытке обработать запрос. Вы можете повторно повторить тот же запрос после предложений при обработке повторений . Если ошибка сохраняется, пожалуйста, свяжитесь с поддержкой Firebase.
THIRD_PARTY_AUTH_ERROR (код ошибки http = 401) Сертификат APNS или клавиша Web Push Auth был недействительным или отсутствует. Сообщение, предназначенное для устройства iOS или регистрации в Интернете, не может быть отправлено. Проверьте обоснованность ваших учетных данных разработки и производства.

Коды ошибок администратора

В следующей таблице перечислены коды ошибок API API Firebase Admin и их описания, включая рекомендуемые шаги разрешения.

Код ошибки Шаги описания и разрешения
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 Предоставленный регистрационный токен не зарегистрирован. Ранее действительный токен регистрации может быть незарегистрирован по разным причинам, в том числе:
  • Клиентское приложение не зарегистрировалось от FCM.
  • Клиентское приложение было автоматически незарегистрировано. Это может произойти, если пользователь удаляет приложение или на платформах Apple, если служба обратной связи APNS сообщила о токене APNS как недействительным.
  • Срок регистрации истек. Например, Google может решить обновить токены регистрации регистрации, или токен APNS, возможно, истек для устройств Apple.
  • Клиентское приложение было обновлено, но новая версия не настроена на получение сообщений.
Для всех этих случаев удалите этот токен регистрации и прекратите использование его для отправки сообщений.
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, не может быть отправлено, потому что требуемый сертификат APNS SSL не был загружен или истек. Проверьте обоснованность ваших сертификатов разработки и производства.
messaging/mismatched-credential Учетные данные, используемые для аутентификации этого SDK, не имеют разрешения на отправку сообщений на устройство, соответствующее предоставляемому токен регистрации. Убедитесь, что оба учетные данные и токен регистрации принадлежат к одному и тому же проекту Firebase. См. Добавьте Firebase в ваше приложение для документации о том, как аутентифицировать SDK Admin Admin Firebase.
messaging/authentication-error SDK не мог аутентифицировать на серверах FCM. Убедитесь, что вы аутентифицируете SDK Admin Firebase с учетом учетных данных, которые имеют надлежащие разрешения на отправку сообщений FCM. См. Добавьте Firebase в ваше приложение для документации о том, как аутентифицировать SDK Admin Admin Firebase.
messaging/server-unavailable Сервер FCM не мог обработать запрос вовремя. Вы должны повторить тот же запрос, но вы должны:
  • Почитайте заголовок Retry-After , если он включен в ответ от сервера соединений FCM.
  • Реализуйте экспоненциальный отступление в вашем механизме повторной попытки. Например, если вы ждали одну секунду до первой попытки, подождите как минимум за две секунды до следующей, затем четыре секунды и так далее. Если вы отправляете несколько сообщений, отложите каждый из них независимо на дополнительную случайную сумму, чтобы избежать выдачи нового запроса на все сообщения одновременно.
Отправители, которые вызывают проблемы, рискуют быть в черном списке.
messaging/internal-error Сервер FCM столкнулся с ошибкой, пытаясь обработать запрос. Вы можете повторить тот же запрос, следуя требованиям, перечисленным в строке messaging/server-unavailable . Если ошибка сохраняется, сообщите о проблеме нашего канала поддержки отчета об ошибках .
messaging/unknown-error Неизвестная ошибка сервера была возвращена. См. Реакцию RAW Server в сообщении об ошибке для получения более подробной информации. Если вы получите эту ошибку, сообщите о полном сообщении об ошибке в нашем канале поддержки отчета об ошибках .

Отправлять сообщения с помощью протоколов Sergacy App Server

Если вы в настоящее время используете устаревшие протоколы, создайте запросы на сообщения, как показано в этом разделе. Имейте в виду, что, если вы отправляете на несколько платформ через HTTP, протокол V1 может значительно упростить ваши запросы.

Отправить сообщения на определенные устройства

Чтобы отправить сообщения на определенные устройства, установите to для регистрационного токена для конкретного экземпляра приложения. См. Информацию о настройке клиента для вашей платформы, чтобы узнать больше о регистрационных токенах.

Http post запрос

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 очень похожа на отправку сообщений на отдельное устройство или группу пользователей. Сервер приложений устанавливает ключ to значения, например /topics/yourTopic . Разработчики могут выбрать любое имя темы, которое соответствует регулярному выражению: "/topics/[a-zA-Z0-9-_.~%]+" .

Чтобы отправить комбинации нескольких тем, сервер приложений должен установить ключ condition (вместо ключа to ) в логическое условие, которое указывает целевые темы. Например, отправлять сообщения на устройства, которые подписались на TopicA , а также TopicB или TopicC :

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

FCM сначала оценивает все условия в скобках, а затем оценивает выражение слева направо. В приведенном выше выражении пользователь, подписанный на какую-либо отдельную тему, не получает сообщение. Аналогично, пользователь, не подписанный на TopicA, не получит сообщение. Эти комбинации получают его:

  • Тема А и Тема Б
  • ТемаA и ТемаC

Вы можете включить до пяти тем в свое условное выражение, а скобки поддерживаются. Поддерживаемые операторы: && , || .

Тема 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 -интерфейсов Legacy очень похожа на отправку сообщений на отдельное устройство. Установите to для уникального ключа уведомления для группы устройств. Примеры в этом разделе показывают, как отправлять сообщения данных в группы устройств в протоколах Legacy 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 response

Вот пример «успеха» - у notification_key есть 2 токена регистрации, связанные с ним, и сообщение было успешно отправлено им обоим:

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

Вот пример «частичного успеха» - у notification_key есть 3 токена регистрации, связанные с ним. Сообщение было успешно отправлено только в 1 из токенов регистрации. В сообщении ответа перечислены токены регистрации ( registration_ids ), которые не получили сообщения:

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

Когда сообщение не доставляется в один или несколько токенов регистрации, связанных с notification_key , сервер приложений должен повторно повторно с отбором между RESRIES.

Если сервер пытается отправить сообщение в группу устройств, у которой нет участников, ответ выглядит как следующее, с 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 Connection Server не может доставить ко всем устройствам в группе. App Server получит ответ NACK.

Полный список параметров сообщений см. Справочную информацию для выбранного вами протокола сервера соединений, HTTP или XMPP .

Уставление Firebase Admin SDK Legacy Отправить методы

Admin Node Firebase node.js SDK поддерживает методы отправки сообщений (FCM) на основе API унаследованного 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() отклоняется ошибкой. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API FCM администратора» .

Отправить в группу устройств

Метод 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() отклоняется от ошибки. Полный список кодов ошибок, включая описания и шаги по устранению, см. в разделе «Ошибки API FCM администратора» .

Определение полезной нагрузки сообщения

Вышеуказанные методы, основанные на протоколах устаревших 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 для полного списка ограничений.

Определение параметров сообщения

Приведенные выше методы, основанные на протоколах Legacy 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 для полного списка доступных вариантов.