Управление подписками на темы

Подписать клиентское приложение на тему можно как с сервера, так и с клиента:

  • На сервере используется Firebase Admin SDK .

  • На стороне клиента используйте клиентский API внутри вашего приложения.

Управляйте подписками на темы с помощью Admin SDK.

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

Вы можете подписать экземпляры клиентских приложений на любую существующую тему или создать новую. Когда вы используете API для подписки клиентского приложения на новую тему (которая еще не существует для вашего проекта Firebase), в FCM создается новая тема с этим именем, и любой клиент впоследствии может на нее подписаться.

В метод подписки Firebase Admin SDK можно передать список регистрационных токенов, чтобы подписать соответствующие устройства на тему:

Node.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // ...
  'YOUR_REGISTRATION_TOKEN_n'
];

// Subscribe the devices corresponding to the registration tokens to the
// topic.
getMessaging().subscribeToTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully subscribed to topic:', response);
  })
  .catch((error) => {
    console.log('Error subscribing to topic:', error);
  });

Java

// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

// Subscribe the devices corresponding to the registration tokens to the
// topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were subscribed successfully");

Python

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Subscribe the devices corresponding to the registration tokens to the
# topic.
response = messaging.subscribe_to_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were subscribed successfully')

Идти

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Subscribe the devices corresponding to the registration tokens to the
// topic.
response, err := client.SubscribeToTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were subscribed successfully")

C#

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Subscribe the devices corresponding to the registration tokens to the
// topic
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were subscribed successfully");

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

Node.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // ...
  'YOUR_REGISTRATION_TOKEN_n'
];

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
getMessaging().unsubscribeFromTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully unsubscribed from topic:', response);
  })
  .catch((error) => {
    console.log('Error unsubscribing from topic:', error);
  });

Java

// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().unsubscribeFromTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were unsubscribed successfully");

Python

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_n',
]

# Unubscribe the devices corresponding to the registration tokens from the
# topic.
response = messaging.unsubscribe_from_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were unsubscribed successfully')

Идти

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
response, err := client.UnsubscribeFromTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were unsubscribed successfully")

C#

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Unsubscribe the devices corresponding to the registration tokens from the
// topic
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were unsubscribed successfully");

Методы subscribeToTopic() и unsubscribeFromTopic() возвращают объект, содержащий ответ от FCM . Возвращаемый тип имеет одинаковый формат независимо от количества регистрационных токенов, указанных в запросе.

В случае ошибки (сбой аутентификации, недействительный токен или тема и т. д.) эти методы приводят к ошибке. Полный список кодов ошибок, включая описания и шаги по их устранению, см. в разделе «Ошибки Firebase Admin SDK .

Управляйте подписками на темы из вашего клиентского приложения.

Экземпляры клиентских приложений также могут подписываться или отписываться от тем непосредственно из вашего приложения через SDK Firebase. Обратите внимание, что FCM повторяет попытки в случае первоначальных сбоев, чтобы убедиться в успешной подписке.

Выберите свою платформу:

Android

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

Для подписки на тему клиентское приложение вызывает subscribeToTopic() Firebase Cloud Messaging указывая имя темы FCM . Этот метод возвращает Task , который может быть использован слушателем завершения для определения успешности подписки:

Kotlin

Firebase.messaging.subscribeToTopic("weather")
    .addOnCompleteListener { task ->
        var msg = "Subscribed"
        if (!task.isSuccessful) {
            msg = "Subscribe failed"
        }
        Log.d(TAG, msg)
        Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
    }

Java

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                String msg = "Subscribed";
                if (!task.isSuccessful()) {
                    msg = "Subscribe failed";
                }
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Для отмены подписки клиентское приложение вызывает функцию Firebase Cloud Messaging unsubscribeFromTopic() , указав имя темы.

iOS

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

Чтобы подписаться на тему, вызовите метод подписки из основного потока вашего приложения ( FCM не является потокобезопасным). Если запрос на подписку изначально не удается, FCM автоматически повторяет попытку. В случаях, когда подписка не может быть завершена, генерируется ошибка, которую можно перехватить в обработчике завершения, как показано ниже:

Быстрый

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

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

При каждом запуске приложения FCM проверяет, подписаны ли все запрошенные темы. Чтобы отписаться, вызовите функцию unsubscribeFromTopic:topic , и FCM отпишется от темы в фоновом режиме.

C++

Чтобы подписаться на тему, вызовите функцию ::firebase::messaging::Subscribe из вашего приложения. Это выполнит асинхронный запрос к бэкэнду FCM и подпишет клиента на указанную тему.

::firebase::messaging::Subscribe("example");

Если запрос на подписку изначально не удается, FCM повторяет попытки до тех пор, пока не сможет успешно подписаться на тему. При каждом запуске приложения FCM проверяет, подписаны ли все запрошенные темы.

Чтобы отписаться, вызовите ::firebase::messaging::Unsubscribe , и FCM отпишется от темы в фоновом режиме.

Единство

Чтобы подписаться на тему, вызовите метод Firebase.Messaging.FirebaseMessaging.Subscribe из вашего приложения. Это выполнит асинхронный запрос к бэкэнду FCM и подпишет клиента на указанную тему.

Firebase.Messaging.FirebaseMessaging.Subscribe("/topics/example");

Если запрос на подписку изначально не удается, FCM повторяет попытки до тех пор, пока не сможет успешно подписаться на тему. При каждом запуске приложения FCM проверяет, подписаны ли все запрошенные темы.

Чтобы отписаться, вызовите метод Firebase.Messaging.FirebaseMessaging.Unsubscribe , и FCM отпишется от темы в фоновом режиме.

Устаревшая серверная система управления темами (устарела)

Чтобы понять, что такое идентификаторы экземпляров, посетите страницу идентификаторов экземпляров . Подробную информацию об устаревших конечных точках см. в справочнике API идентификаторов экземпляров .