Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Используя Firebase Admin SDK или протоколы сервера приложений FCM, вы можете создавать запросы сообщений и отправлять их следующим типам целей:

  • Название темы
  • Состояние
  • Токен регистрации устройства
  • Имя группы устройств (устаревшие протоколы и Firebase Admin SDK только для Node.js)

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

Примеры на этой странице показано , как отправлять сообщения уведомления с помощью 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);

Python

# 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)

C #

// 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 Администратор SDK возвращает идентификатор строки в формате projects/{project_id}/messages/{message_id} . Ответ протокола HTTP - это единственный ключ JSON:

    {
      "name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96"
    }

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

REST API и Admin FCM API позволяют выполнять многоадресную рассылку сообщения списку токенов регистрации устройств. Вы можете указать до 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");

Python

# 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 100 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)

C #

// 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.SendMulticastAsync(message);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

ОТДЫХАТЬ

Создайте пакетный HTTP-запрос:

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message!"
     }
  }
}

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message!"
     }
  }
}
--subrequest_boundary--

Сохраните запрос в файл (в этом примере batch_request.txt). Затем используйте команду cURL:

curl --data-binary @batch_request.txt -H 'Content-Type: multipart/mixed; boundary="subrequest_boundary"' https://fcm.googleapis.com/batch

Для Firebase администратора SDKs, эта операция использует sendAll() API под капотом, как показано в примерах. Возвращаемое значение является BatchResponse , чьи ответы список соответствует порядку ввода маркеров. Это полезно, когда вы хотите проверить, какие токены привели к ошибкам.

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

Python

# 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 100 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)
}

C #

// 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.SendMulticastAsync(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}");
}

ОТДЫХАТЬ

Каждая подотправка отправки возвращает ответ. Ответы разделены отклика граничной строки , начинающейся с --batch_ .

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141125%43c11b7043c11b70"
}

...

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141696%43c11b7043c11b70"
}

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q--

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

После того, как вы создали тему, либо подписавшись экземплярами приложения клиента к теме на стороне клиента или через сервер API , вы можете отправлять сообщения в эту тему. Если это ваш первый раз строит запросы посыла для ТСМ, смотрите руководство к серверной среде и ТСМ для получения важной информации фона и настройки.

В логике отправки на серверной части укажите желаемое имя темы, как показано:

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

Python

# 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)

C #

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

Python

# 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)

C #

// 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

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

Пакеты REST API и Admin SDK поддерживают отправку сообщений пакетами. Вы можете сгруппировать до 500 сообщений в один пакет и отправить их все за один вызов API, со значительным улучшением производительности по сравнению с отправкой отдельных HTTP-запросов для каждого сообщения.

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

Node.js

// Create a list containing up to 500 messages.
const messages = [];
messages.push({
  notification: { title: 'Price drop', body: '5% off all electronics' },
  token: registrationToken,
});
messages.push({
  notification: { title: 'Price drop', body: '2% off all books' },
  topic: 'readers-club',
});

getMessaging().sendAll(messages)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
  });

Джава

// Create a list containing up to 500 messages.
List<Message> messages = Arrays.asList(
    Message.builder()
        .setNotification(Notification.builder()
            .setTitle("Price drop")
            .setBody("5% off all electronics")
            .build())
        .setToken(registrationToken)
        .build(),
    // ...
    Message.builder()
        .setNotification(Notification.builder()
            .setTitle("Price drop")
            .setBody("2% off all books")
            .build())
        .setTopic("readers-club")
        .build()
);

BatchResponse response = FirebaseMessaging.getInstance().sendAll(messages);
// See the BatchResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " messages were sent successfully");

Python

# 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 100 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)

C #

// 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.SendAllAsync(messages);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

ОТДЫХАТЬ

Создайте пакетный HTTP-запрос, объединив список подзапросов:

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message to device 0!"
     }
  }
}

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "topic":"readers-club",
     "notification":{
       "title":"Price drop",
       "body":"2% off all books"
     }
  }
}

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message to device N!"
     }
  }
}
--subrequest_boundary--

Вы можете запросить возвращенный BatchResponse проверить , сколько сообщений были переданы в ТСМ успешно. Он также предоставляет список ответов, которые можно использовать для проверки состояния отдельных сообщений. Порядок ответов соответствует порядку сообщений в списке ввода.

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

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

Отправить с помощью 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 и протокол FCM v1 HTTP и разрешить запросы сообщений , чтобы установить все поля , доступные в message объекта. Это включает:

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

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

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

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

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

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

Когда использовать поля, зависящие от платформы

Используйте поля, зависящие от платформы, если вы хотите:

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

Всякий раз , когда вы хотите , чтобы отправить значение только для конкретных платформ, не используйте общие поля; используйте поля, зависящие от платформы. Например, чтобы отправить уведомление только в iOS и Интернет, но не в Android, вы должны использовать два отдельных набора полей: один для iOS и один для Интернета.

При отправке сообщения с определенными вариантами доставки , использование платформы конкретных полей для их установки. При желании вы можете указать разные значения для каждой платформы. Однако даже если вы хотите установить по существу одно и то же значение для разных платформ, вы должны использовать поля, зависящие от платформы. Это происходит потому , что каждая платформа может интерпретировать значение немного по -другому, например, время-жить устанавливается на Android , как срок действия в секундах, в то время как на прошивке она установлена в качестве даты истечения срока действия.

Пример: уведомление с параметрами цвета и значка

В этом примере запроса на отправку отправляется общий заголовок и контент уведомления на все платформы, но он также отправляет некоторые зависящие от платформы переопределения на устройства 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();

Python

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

C #

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

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

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

Тема 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 вернет успешный или неудачный ответ на запросы отправки темы. Обязательно установите значение тайм-аута сервера приложений в запросе соответствующим образом.

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

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

HTTP-запрос POST группы устройств

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

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

HTTP-ответ группы устройств

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

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

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

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

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

Если сервер пытается отправить сообщение группе устройств, в которой нет членов, ответ будет выглядеть следующим образом: 0 успехов и 0 ошибок:

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

Сообщение XMPP группы устройств

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

Ответ XMPP группы устройств

Когда сообщение успешно отправлено на любое из устройств в группе, сервер соединений XMPP отвечает ACK. Если все сообщения, отправленные на все устройства в группе, терпят неудачу, сервер соединений XMPP отвечает NACK.

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

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

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

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

Когда сервер соединений FCM не может доставить на все устройства в группе. Сервер приложений получит ответ «нет».

Для полного списка опций сообщения см справочной информации для выбранного протокола сервера связи с этим , HTTP или XMPP .

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

Firebase Администратор Node.js SDK поддерживает методы для отправки (ТСМ) сообщения , основанные на сервере API Наследство ТСМ . Эти методы принимают разные аргументы , по сравнению с 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 Администратор ТСМ .

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

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

Вы можете использовать устройство группового обмена сообщениями с помощью унаследованного XMPP или HTTP протоколы на вашем сервере приложений. Firebase Admin SDK для Node.js на основе устаревших протоколов также предоставляют возможности обмена сообщений групп устройств. Максимальное количество членов, разрешенное для ключа уведомления - 20.

Вы можете создавать группы устройств и генерировать ключи уведомлений через сервер приложений или клиент Android. См Управления групп устройств для деталей.

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() метод возвращает обещание , что не будет решена с MessagingDeviceGroupResponse объекта , содержащего ответ от FCM.

Некоторые случаи, такие как ошибка аутентификации или ограничение скорости, приводят к невозможности обработки всего сообщения. В этих случаях, обещание возвращаемого sendToDeviceGroup() отклоняется с ошибкой. Полный список кодов ошибок, включая описание и шаги разрешения смотрите ошибки API Администратор ТСМ .

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

Приведенные выше методы , основанные на FCM унаследованных протоколов принимать полезную нагрузку сообщения в качестве второго аргумента и поддерживают оба уведомление и данные сообщений . Вы можете указать типы один или оба сообщения, создав объект с data и / или notification ключей. Например, вот как определить различные типы полезных данных сообщения:

Уведомительное сообщение

const payload = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  }
};

Сообщение с данными

const payload = {
  data: {
    score: '850',
    time: '2:45'
  }
};

Комбинированное сообщение

const payload = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  data: {
    stock: 'GOOG',
    open: '829.62',
    close: '635.67'
  }
};

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

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

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

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

Node.js

// This registration token comes from the client FCM SDKs.
const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// See the "Defining the message payload" section above for details
// on how to define a message payload.
const payload = {
  notification: {
    title: 'Urgent action needed!',
    body: 'Urgent action is needed to prevent your account from being disabled!'
  }
};

// Set the message as high priority and have it expire after 24 hours.
const options = {
  priority: 'high',
  timeToLive: 60 * 60 * 24
};

// Send a message to the device corresponding to the provided
// registration token with the provided options.
getMessaging().sendToDevice(registrationToken, payload, options)
  .then((response) => {
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Смотрите справочные документы для MessagingOptions для полного списка доступных опций.