Как отправить сообщение с помощью Firebase Admin SDK

Если вы ещё не настроили Firebase Admin SDK, следуйте инструкциям , чтобы сделать это Firebase Admin SDK на сервере.

Как включить FCM HTTP v1 API

  1. В консоли Firebase выберите Настройки > Общие. Затем нажмите на вкладку Обмен сообщениями в облаке.

  2. Включите Cloud Messaging API.

Как авторизовать сервисный аккаунт из другого проекта

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

  1. В проекте отправителя убедитесь, что включен Firebase Cloud Messaging API. Проверьте, включена ли она в консоли Firebase. Для этого выберите Настройки > Общие. Затем нажмите на вкладку Обмен сообщениями в облаке.

  2. В проекте отправителя создайте сервисный аккаунт.

  3. В целевом проекте назначьте роль администратора Firebase Cloud Messaging API адресу электронной почты сервисного аккаунта. Это можно сделать на странице IAM в разделе IAM и администрирование консоли Google Cloud. Эта роль позволяет сервисному аккаунту из проекта отправителя отправлять сообщения в целевой проект.

  4. Инициализируйте SDK с помощью файла ключа сервисного аккаунта исходного проекта и идентификатора целевого проекта.

    Node.js

    import { initializeApp, applicationDefault } from 'firebase-admin/app';
    
    initializeApp({
      // The credential is configured to be the sender project's service
      // account key via the environment variable GOOGLE_APPLICATION_CREDENTIALS
      credential: applicationDefault(),
      projectId: '<TARGET_PROJECT_ID>',
    });
    

    Java

    FirebaseOptions options = FirebaseOptions.builder()
        // The credential is configured to be the sender project's service
        // account key via the environment variable GOOGLE_APPLICATION_CREDENTIALS
        .setCredentials(GoogleCredentials.getApplicationDefault())
        .setProjectId("<TARGET_PROJECT_ID>")
        .build();
    
    FirebaseApp.initializeApp(options);
    

    Python

    import firebase_admin
    
    app_options = {'projectId': '<TARGET_PROJECT_ID>'}
    # Initialize with the default credential, i.e. the sender project's service
    # account key, stored in GOOGLE_APPLICATION_CREDENTIALS
    default_app = firebase_admin.initialize_app(options=app_options)
    

    Проложить маршрут

    config := &firebase.Config{ProjectID: "<TARGET_PROJECT_ID>"}
    // Initialize with the default credential, i.e. the sender project's service
    // account key, stored in GOOGLE_APPLICATION_CREDENTIALS
    app, err := firebase.NewApp(context.Background(), config)
    if err != nil {
            log.Fatalf("error initializing app: %v\n", err)
    }
    

    C#

    FirebaseApp.Create(new AppOptions()
    {
        // The credential is configured to be the sender project's service
        // account key via the environment variable GOOGLE_APPLICATION_CREDENTIALS
        Credential = GoogleCredential.GetApplicationDefault(),
        ProjectId = "<TARGET_PROJECT_ID>",
    });
    

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

Чтобы отправить сообщение на определенное устройство, можно настроить таргетинг на идентификатор установки Firebase (FID) или токен регистрации.

Node.js

Использование FID (рекомендуется)

// This installation ID comes from the client FCM SDKs.
const fid = 'YOUR_REGISTERED_FID';

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

// Send a message to the device corresponding to the provided FID.
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.
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);
  });

Java

Использование FID (рекомендуется)

// This installation ID comes from the client FCM SDKs.
String fid = "YOUR_REGISTERED_FID";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setFid(fid)
    .build();

// Send a message to the device corresponding to the provided FID.
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.
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().sendAsync(message).get();
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Python

Использование FID (рекомендуется)

# This installation ID comes from the client FCM SDKs.
fid = 'YOUR_REGISTERED_FID'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    fid=fid,
)

# Send a message to the device corresponding to the provided FID.
response = messaging.send(message)
# Response is a message ID string.
print('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)

Проложить маршрут

Использование FID (рекомендуется)

// 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 installation ID comes from the client FCM SDKs.
fid := "YOUR_REGISTERED_FID"

// See documentation on defining a message payload.
message := &messaging.Message{
    Data: map[string]string{
        "score": "850",
        "time":  "2:45",
    },
    Fid: fid,
}

// Send a message to the device corresponding to the provided FID.
response, err := client.Send(ctx, message)
if err != nil {
    log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("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#

Использование FID (рекомендуется)

// This installation ID comes from the client FCM SDKs.
var fid = "YOUR_REGISTERED_FID";

var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Fid = fid,
};

// Send a message to the device corresponding to the provided FID.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("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" },
                },
#pragma warning disable CS0618
                Token = registrationToken,
#pragma warning restore CS0618
            };

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

При успешном выполнении каждый метод отправки возвращает идентификатор сообщения. Функция Firebase Admin SDK возвращает строку идентификатора в формате projects/{project_id}/messages/{message_id}.

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

Административные SDK FCM позволяют отправлять многоадресные сообщения списку идентификаторов установки Firebase (FID) или токенов регистрации устройств. Эту функцию можно использовать, когда нужно отправить одно и то же сообщение на большое количество устройств. За один вызов можно указать до 500 идентификаторов экземпляров приложений и/или токенов.

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

Node.js

С помощью идентификаторов фидов (рекомендуется)

// These Firebase Installation IDs (FIDs) come from the client FCM SDKs.
const fids = [
  'YOUR_REGISTERED_FID_1',
  // ...
  'YOUR_REGISTERED_FID_N'
];

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

getMessaging().sendEachForMulticast(message)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
    if (response.failureCount > 0) {
      const failedFids = [];
      response.responses.forEach((resp, idx) => {
        if (!resp.success) {
          failedFids.push(fids[idx]);
        }
      });
      console.log('List of FIDs that caused failures: ' + failedFids);
    }
  });

Использование токенов регистрации (поддержка прекращена)

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

Java

Использование идентификаторов экземпляров приложений (рекомендуется)

// These Firebase Installation IDs (FIDs) come from the client FCM SDKs.
List<String> fids = Arrays.asList(
    "YOUR_REGISTERED_FID_1",
    // ...
    "YOUR_REGISTERED_FID_N"
);

MulticastMessage message = MulticastMessage.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .addAllFids(fids)
    .build();

BatchResponse response = FirebaseMessaging.getInstance().sendEachForMulticast(message);
if (response.getFailureCount() > 0) {
  List<SendResponse> responses = response.getResponses();
  List<String> failedFids = 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 destination FIDs.
      failedFids.add(fids.get(i));
    }
  }
  System.out.println("List of FIDs that caused failures: " + failedFids);
}

Использование токенов регистрации (поддержка прекращена)

// 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().sendEachForMulticast(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 Firebase Installation IDs (FIDs) come from the client FCM SDKs.
fids = [
    'YOUR_REGISTERED_FID_1',
    # ...
    'YOUR_REGISTERED_FID_N',
]

message = messaging.MulticastMessage(
    data={'score': '850', 'time': '2:45'},
    fids=fids,
)
response = messaging.send_each_for_multicast(message)
if response.failure_count > 0:
    responses = response.responses
    failed_fids = []
    for idx, resp in enumerate(responses):
        if not resp.success:
            # The order of responses corresponds to the order of the destination FIDs.
            failed_fids.append(fids[idx])
    print('List of FIDs that caused failures: {0}'.format(failed_fids))

Использование токенов регистрации (поддержка прекращена)

# 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_each_for_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(f'List of tokens that caused failures: {failed_tokens}')

Проложить маршрут

Использование идентификаторов экземпляров приложений (рекомендуется)

// Create a list containing up to 500 Firebase Installation IDs (FIDs).
// These Firebase Installation IDs (FIDs) come from the client FCM SDKs.
fids := []string{
    "YOUR_REGISTERED_FID_1",
    // ...
    "YOUR_REGISTERED_FID_N",
}

message := &messaging.MulticastMessage{
    Data: map[string]string{
        "score": "850",
        "time":  "2:45",
    },
    Fids: fids,
}

br, err := client.SendEachForMulticast(ctx, message)
if err != nil {
    log.Fatalln(err)
}

if br.FailureCount > 0 {
    var failedFids []string
    for idx, resp := range br.Responses {
        if !resp.Success {
            // The order of responses corresponds to the order of the destination FIDs.
            failedFids = append(failedFids, fids[idx])
        }
    }
    fmt.Printf("List of FIDs that caused failures: %v\n", failedFids)
}

Использование токенов регистрации (поддержка прекращена)

// 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.SendEachForMulticast(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 Firebase Installation IDs (FIDs) come from the client FCM SDKs.
var fids = new List<string>()
{
    "YOUR_REGISTERED_FID_1",
    // ...
    "YOUR_REGISTERED_FID_N",
};

var message = new MulticastMessage()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Fids = fids,
};

var response = await FirebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message);

if (response.FailureCount > 0)
{
    var failedFids = 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 destination FIDs.
            failedFids.add(fids[i]);
        }
    }
    Console.WriteLine($"List of FIDs that caused failures: {string.Join(", ", failedFids)}");
}

Использование токенов регистрации (поддержка прекращена)

            // 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()
            {
#pragma warning disable CS0618
                Tokens = registrationTokens,
#pragma warning restore CS0618
                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}");
            }

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

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

Node.js

Используйте смешанные цели (рекомендуется)

// Create a list containing up to 500 messages.
const messages = [
  {
    notification: { title: 'Price drop', body: '5% off all electronics' },
    fid: 'YOUR_REGISTERED_FID', // Using FID (Recommended)
  },
  {
    notification: { title: 'Price drop', body: '2% off all books' },
    token: 'YOUR_REGISTRATION_TOKEN', // Using token (Deprecated)
  },
  {
    notification: { title: 'Price drop', body: '10% off all shoes' },
    topic: 'readers-club',
  }
];

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

Использование токенов регистрации (поддержка прекращена)

// 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().sendEach(messages)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
  });

Java

Используйте смешанные цели (рекомендуется)

// Create a list containing up to 500 messages.
List<Message> messages = new ArrayList<>();
messages.add(Message.builder()
    .setNotification(Notification.builder()
        .setTitle("Price drop")
        .setBody("5% off all electronics")
        .build())
    .setFid("YOUR_REGISTERED_FID") // Using FID (Recommended)
    .build());
messages.add(Message.builder()
    .setNotification(Notification.builder()
        .setTitle("Price drop")
        .setBody("2% off all books")
        .build())
    .setToken("YOUR_REGISTRATION_TOKEN") // Using token (Deprecated)
    .build());
messages.add(Message.builder()
    .setNotification(Notification.builder()
        .setTitle("Price drop")
        .setBody("10% off all shoes")
        .build())
    .setTopic("readers-club")
    .build());

BatchResponse response = FirebaseMessaging.getInstance().sendEach(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.
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().sendEach(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'),
        fid='YOUR_REGISTERED_FID', # Using FID (Recommended)
    ),
    messaging.Message(
        notification=messaging.Notification('Price drop', '2% off all books'),
        token='YOUR_REGISTRATION_TOKEN', # Using token (Deprecated)
    ),
    messaging.Message(
        notification=messaging.Notification('Price drop', '10% off all shoes'),
        topic='readers-club',
    ),
]

response = messaging.send_each(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('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_each(messages)
# See the BatchResponse reference documentation
# for the contents of response.
print(f'{response.success_count} messages were sent successfully')

Проложить маршрут

Используйте смешанные цели (рекомендуется)

// Create a list containing up to 500 messages.
messages := []*messaging.Message{
    {
        Notification: &messaging.Notification{
            Title: "Price drop",
            Body:  "5% off all electronics",
        },
        Fid: "YOUR_REGISTERED_FID", // Using FID (Recommended)
    },
    {
        Notification: &messaging.Notification{
            Title: "Price drop",
            Body:  "2% off all books",
        },
        Token: "YOUR_REGISTRATION_TOKEN", // Using token (Deprecated)
    },
    {
        Notification: &messaging.Notification{
            Title: "Price drop",
            Body:  "10% off all shoes",
        },
        Topic: "readers-club",
    },
}

br, err := client.SendEach(ctx, 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.
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.SendEach(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",
        },
        Fid = "YOUR_REGISTERED_FID", // Using FID (Recommended)
    },
    new Message()
    {
        Notification = new Notification()
        {
            Title = "Price drop",
            Body = "2% off all books",
        },
        Token = "YOUR_REGISTRATION_TOKEN", // Using token (Deprecated)
    },
    new Message()
    {
        Notification = new Notification()
        {
            Title = "Price drop",
            Body = "10% off all shoes",
        },
        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");

Использование токенов регистрации (поддержка прекращена)

            // 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",
                    },
#pragma warning disable CS0618
                    Token = registrationToken,
#pragma warning restore CS0618
                },
                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");