Administrar suscripciones a temas

Puedes suscribir una app cliente a un tema desde el servidor o el cliente:

  • En el servidor, con Firebase Admin SDK

  • En el cliente, usando la API del cliente dentro de tu app

Administra suscripciones a temas con el SDK de Admin

El Firebase Admin SDK te permite realizar tareas básicas de administración de temas desde el servidor. Con los tokens de registro, puedes realizar y anular la suscripción de las instancias de la app cliente de forma masiva mediante la lógica del servidor.

Puedes suscribir instancias de la app cliente a cualquier tema existente o puedes crear un tema nuevo. Cuando una app cliente se suscribe mediante la API a un tema nuevo (uno que no existe aún para tu proyecto de Firebase), se crea un tema nuevo con ese nombre en FCM y, después, cualquier cliente se puede suscribir a él.

Puedes pasar una lista de estos tokens de registro al método de suscripción del Firebase Admin SDK para suscribir los dispositivos correspondientes a un tema, como en estos ejemplos:

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

Go

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

El Firebase Admin SDK también te permite anular la suscripción de dispositivos a un tema pasando los tokens de registro al método correspondiente, como en estos ejemplos:

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

Go

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

Los métodos subscribeToTopic() y unsubscribeFromTopic() generan un objeto que contiene la respuesta de FCM. El tipo de datos que se muestra tiene el mismo formato, sin importar la cantidad de tokens de registro especificados en la solicitud.

En caso de falla (fallas de autenticación, token o tema no válido, etc.), los métodos muestran un error. Para ver una lista completa de los códigos de error con descripciones y pasos para su resolución, consulta Errores de Firebase Admin SDK.

Administra suscripciones a temas desde tu app cliente

Las instancias de la app cliente también pueden suscribirse o anular su suscripción a temas directamente desde tu app a través de los SDK de Firebase. Ten en cuenta que FCM vuelve a intentarlo en caso de fallas iniciales para garantizar que la suscripción se realice correctamente.

Elige tu plataforma:

Android

Las apps cliente se pueden suscribir a cualquier tema existente o pueden crear un tema nuevo. Cuando una app cliente se suscribe a un nombre de tema nuevo (uno que no existe aún para tu proyecto de Firebase), se crea un tema nuevo con ese nombre en FCM y cualquier cliente se puede suscribir a él posteriormente.

Para suscribirse a un tema, la app cliente llama a subscribeToTopic() de Firebase Cloud Messaging con el nombre del tema de FCM. Este método muestra una Task, que un objeto de escucha de finalización puede usar para determinar si la suscripción se realizó correctamente:

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

Para anular la suscripción, la app cliente llama a unsubscribeFromTopic() de Firebase Cloud Messaging con el nombre del tema.

iOS

Las apps cliente se pueden suscribir a cualquier tema existente o pueden crear un tema nuevo. Cuando una app cliente se suscribe a un nombre de tema nuevo (uno que no existe aún para tu proyecto de Firebase), se crea un tema nuevo con ese nombre en FCM y cualquier cliente se puede suscribir a él posteriormente.

Para suscribirte a un tema, llama al método de suscripción desde el subproceso principal de la aplicación (FCM no cuenta con protección de subprocesos). Si la solicitud de suscripción falla en el inicio, FCM vuelve a intentarlo automáticamente. Cuando la suscripción no se puede completar, esta genera un error que puedes capturar en un controlador de finalización, como se muestra a continuación:

Swift

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

Esta llamada realiza una solicitud asíncrona al backend de FCM y suscribe al cliente al tema determinado. Antes de llamar a subscribeToTopic:topic, asegúrate de que la instancia de app cliente ya haya recibido un token de registro a través de la devolución de llamada didReceiveRegistrationToken.

Cada vez que la app se inicia, FCM se asegura de que todos los temas solicitados estén suscritos. Para anular la suscripción, llama a unsubscribeFromTopic:topic, y FCM la anulará en segundo plano.

C++

Para suscribirte a un tema, llama a ::firebase::messaging::Subscribe desde tu aplicación. Esto genera una solicitud asíncrona en el backend de FCM y suscribe al cliente a un tema determinado.

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

Si la solicitud de suscripción falla al inicio, FCM vuelve a intentarlo hasta que pueda suscribirse al tema correctamente. Cada vez que la app se inicia, FCM se asegura de que todos los temas solicitados estén suscritos.

Para anular la suscripción, llama a ::firebase::messaging::Unsubscribe y FCM la anulará en segundo plano.

Unity

Para suscribirte a un tema, llama a Firebase.Messaging.FirebaseMessaging.Subscribe desde tu aplicación. Esto genera una solicitud asíncrona en el backend de FCM y suscribe al cliente a un tema determinado.

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

Si la solicitud de suscripción falla al inicio, FCM vuelve a intentarlo hasta que pueda suscribirse al tema correctamente. Cada vez que la app se inicia, FCM se asegura de que todos los temas solicitados estén suscritos.

Para anular la suscripción, llama a Firebase.Messaging.FirebaseMessaging.Unsubscribe y FCM la anulará en segundo plano.

Administración de temas heredada del servidor (obsoleta)

Para comprender qué son los IDs de instancia, visita la página de IDs de instancia. Si quieres obtener detalles sobre los extremos obsoletos, consulta las Referencias de la API de ID de instancia.