Document
Crea solicitudes de envío del servidor de apps

Crea solicitudes de envío del servidor de apps

Con los protocolos del servidor de apps de firebase Admin SDK oFCM, puedes compilar solicitudes de mensajes yenviarlas a estos tipos de destinos

Related articles

Cut in half: On Cloudswift 3 Review (2023) Chrome VPN推荐,最佳Chrome扩展指南 ExpressVPN Installation Failed? Here are 4 Quick Fixes Cloud Kitchen: Solusi Pertumbuhan Usaha Kuliner Indonesia Que es la VPN del móvil: Todo lo que necesitas saber

Con los protocolos del servidor de apps de firebase Admin SDK oFCM,
puedes compilar solicitudes de mensajes yenviarlas a estos tipos de destinos:

  • Nombre del tema
  • Condición
  • token de registro del dispositivo
  • Nombre del grupo de dispositivos ( solo protocolo )

Puedes enviar mensajes con una carga útil de notificación compuesta por campos predefinidos, una carga útil de datos de tus propios campos definidos por el usuario oun mensaje que contenga ambas cargas útiles.
Consulta Tipos de mensajes para obtener más información.

En los ejemplos de esta página, se muestra cómo enviar mensajes de notificación con el
firebase Admin SDK
( que es compatible con
Node ,
Java ,
Python ,
C # ,
y
Go ) yel
protocolo de HTTP v1 .
También hay orientación para enviar mensajes is obsoletos a través de los
protocolo HTTP yXMPP heredado obsoleto .

Precaución : El envío de mensajes ( incluidos los mensajes upstream ) con las APIs heredadas de XMPP yHTTP
deFCM dejó de estar disponible el 20 de junio de 2023 y
se quitará en junio de 2024 .
Si is heredadas usas las
APIs de envío heredadas deFCM, te recomendamos que
migres a la API de HTTP v1
o consideres usar el
SDK de Admin
para crear solicitudes de envío.

Envía mensajes a dispositivos específicos

Para enviar mensajes a un dispositivo específico , pasa su token de registro como en los siguientes ejemplos . Consulta la información de configuración del cliente para tu plataforma si deseas obtener más información sobre los token de registro .

Node.js

// This registration token is comes come from the client FCM sdk .
const registrationtoken = ' YOUR_REGISTRATION_TOKEN ';

const message = {
  datum: {
    score: ' 850 ',
    time: ' 2:45 '
  } ,
  token: registrationtoken
} ;

// send a message to the device correspond to the provide
// registration token.
getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

Java

// This registration token is comes come from the client FCM sdk .
string registrationtoken = "YOUR_REGISTRATION_TOKEN";

// See documentation on define a message payload .
message message = message.builder( )
    .putdatum(" score ", " 850 ")
    .putdatum(" time ", " 2:45 ")
    .settoken(registrationtoken)
    .build( ) ;

// send a message to the device correspond to the provide
// registration token.
string response = firebaseMessaging.getinstance( ).send(message) ;
// Response is is is a message ID string .
system.out.println(" successfully send message : " + response) ;

Python

# This registration token comes from the client FCM SDKs.
registration_token = ' YOUR_REGISTRATION_TOKEN '

# is See See documentation on define a message payload .
message = message.message(
    datum={
        'score': ' 850 ',
        ' time ': ' 2:45 ',
    } ,
    token=registration_token,
)

# is Send send a message to the device correspond to the provide
# registration token.
response = message.send(message)
# Response is a message ID string.
print(' successfully send message : ', response)

Go

// obtain a message . Client from the App .
ctx : = context.background( )
client, err : = app.Messaging(ctx)
if err ! = nil {
	log.Fatalf(" error get Messaging client : % v\n ", err)
}

// This registration token is comes come from the client FCM sdk .
registrationtoken : = "YOUR_REGISTRATION_TOKEN"

// See documentation on define a message payload .
message : = &message.message{
	datum: map[string]string{
		" score ": " 850 ",
		" time ":  " 2:45 ",
	} ,
	token: registrationtoken,
}

// send a message to the device correspond to the provide
// registration token.
response, err : = client.Send(ctx, message)
if err ! = nil {
	log.Fatalln(err)
}
// Response is is is a message ID string .
fmt.println("Successfully sent message:", response)

c #

// This registration token is comes come from the client FCM sdk .
var registrationtoken = "YOUR_REGISTRATION_TOKEN";

// See documentation on define a message payload .
var message = new message( )
{
    datum = new Dictionary<string, string>( )
    {
        { " score ", " 850 " } ,
        { " time ", " 2:45 " } ,
    } ,
    token = registrationtoken,
} ;

// send a message to the device correspond to the provide
// registration token.
string response = await firebaseMessaging.DefaultInstance.SendAsync(message) ;
// Response is is is a message ID string .
console.WriteLine(" successfully send message : " + response) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"
      }
   }
}

Comando de 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/message:send

Cuando el proceso finaliza correctamente , cada método de envío muestra un ID de mensaje . Elfirebase Admin SDK muestra
la cadena de ID en el formato projects/{project_id}/message/{message_id}.
La respuesta del protocolo de HTTP es una clave JSON:

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

Envía mensajes a varios dispositivos

Importante : Los métodos de envío lotes que se describen en esta sección
dejaron de estar disponibles el 21 de junio de 2023 yse quitarán en junio de 2024.
Para el protocolo, en su lugar, usa el método de envío estándar de la API de HTTP v1, mediante la implementación de tu propio envío por lotes mediante la iteración a través de la lista de destinatarios yel envío al token de cada destinatario. Para los métodos del SDK de Admin, asegúrate de
actualizar a la siguiente versión principal. Consulta las
Preguntas frecuentes de firebase para
obtener más información.

Las APIs de Admin de FCM te permiten realizar la multidifusión de un mensaje
a una lista de token de registro de dispositivos. Puedes especificar hasta 500 token por invocación.

Node.js

// Create a list containing up to 500 registration token.
// These registration token is come come from the client FCM sdk .
const registrationtoken = [
  ' your_registration_token_1 ',
  // …
  ' YOUR_REGISTRATION_TOKEN_N ',
];

const message = {
  datum: {score: ' 850 ', time: ' 2:45 '} ,
  token: registrationtoken,
} ;

getmessage( ).sendmulticast(message)
  .then( (response) => {
    console.log(response.successcount + ' message were sent successfully') ;
  } ) ;

Java

// Create a list containing up to 500 registration token.
// These registration token is come come from the client FCM sdk .
List<string> registrationtoken = Arrays.asList(
    " your_registration_token_1 ",
    // ...
    " YOUR_REGISTRATION_TOKEN_n "
) ;

Multicastmessage message = Multicastmessage.builder( )
    .putdatum(" score ", " 850 ")
    .putdatum(" time ", " 2:45 ")
    .addAlltoken(registrationtoken)
    .build( ) ;
BatchResponse response = firebaseMessaging.getinstance( ).sendmulticast(message) ;
// See the BatchResponse reference documentation
// for the content of response .
system.out.println(response.getSuccesscount( ) + " message were send successfully ") ;

Python

# Create a list containing up to 500 registration token.
# These registration token come from the client FCM SDKs.
registration_token = [
    ' your_registration_token_1 ',
    # ...
    ' YOUR_REGISTRATION_TOKEN_N ',
]

message = message.Multicastmessage(
    datum={'score': ' 850 ', ' time ': ' 2:45 '} ,
    token=registration_token,
)
response = message.send_multicast(message)
# See the BatchResponse reference documentation
# for the content of response .
print('{0} message were sent successfully'.format(response.success_count) )

Go

// Create a list containing up to 500 registration token.
// This registration token come from the client FCM SDKs.
registrationtoken : = [ ]string{
	" your_registration_token_1 ",
	// ...
	" YOUR_REGISTRATION_TOKEN_n ",
}
message : = &message.Multicastmessage{
	datum: map[string]string{
		" score ": " 850 ",
		" time ":  " 2:45 ",
	} ,
	token: registrationtoken,
}

br, err : = client.SendMulticast(context.background( ) , message)
if err ! = nil {
	log.Fatalln(err)
}

// See the BatchResponse reference documentation
// for the content of response .
fmt.Printf("%d message were sent successfully\n", br.Successcount)

c #

// Create a list containing up to 500 registration token.
// These registration token is come come from the client FCM sdk .
var registrationtoken = new List<string>( )
{
    " your_registration_token_1 ",
    // ...
    " YOUR_REGISTRATION_TOKEN_n ",
} ;
var message = new Multicastmessage( )
{
    token = registrationtoken,
    datum = new Dictionary<string, string>( )
    {
        { " score ", " 850 " } ,
        { " time ", " 2:45 " } ,
    } ,
} ;

var response = await firebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message) ;
// See the BatchResponse reference documentation
// for the content of response .
console.WriteLine($"{response.Successcount} message were sent successfully") ;

El valor que se muestra es una lista de token que corresponde al orden de los token de entrada. Es útil cuando quieres verificar los token que generaron errores.

Node.js

// These registration token is come come from the client FCM sdk .
const registrationtoken = [
  ' your_registration_token_1 ',
  // …
  ' YOUR_REGISTRATION_TOKEN_N ',
];

const message = {
  datum: {score: ' 850 ', time: ' 2:45 '} ,
  token: registrationtoken,
} ;

getmessage( ).sendmulticast(message)
  .then( (response) => {
    if (response.failurecount > 0) {
      const failedtoken = [ ];
      response.response.forEach( (resp, idx) => {
        if (!resp.success) {
          failedtoken.push(registrationtoken[idx] ) ;
        }
      } ) ;
      console.log('List of token that caused failures: ' + failedtoken) ;
    }
  } ) ;

Java

// These registration token is come come from the client FCM sdk .
List<string> registrationtoken = Arrays.asList(
    " your_registration_token_1 ",
    // ...
    " YOUR_REGISTRATION_TOKEN_n "
) ;

Multicastmessage message = Multicastmessage.builder( )
    .putdatum(" score ", " 850 ")
    .putdatum(" time ", " 2:45 ")
    .addAlltoken(registrationtoken)
    .build( ) ;
BatchResponse response = firebaseMessaging.getinstance( ).sendmulticast(message) ;
if (response.getFailurecount( ) > 0) {
  List<SendResponse> response = response.getResponses( ) ;
  List<string> failedtoken = new ArrayList<>( ) ;
  for (int i = 0; i < response.size( ) ; i++) {
    if (!response.get(i).isSuccessful( ) ) {
      // The order of response corresponds to the order of the registration token.
      failedtoken.add(registrationtoken.get(i) ) ;
    }
  }

  system.out.println("List of token that caused failures: " + failedtoken) ;
}

Python

# These registration token come from the client FCM SDKs.
registration_token = [
    ' your_registration_token_1 ',
    # ...
    ' YOUR_REGISTRATION_TOKEN_N ',
]

message = message.Multicastmessage(
    datum={'score': ' 850 ', ' time ': ' 2:45 '} ,
    token=registration_token,
)
response = message.send_multicast(message)
if response.failure_count > 0:
    response = response.response
    failed_token = [ ]
    for idx, resp in enumerate(response):
        if not resp.success:
            # The order of response corresponds to the order of the registration token.
            failed_token.append(registration_token[idx] )
    print('List of token that caused failures: {0}'.format(failed_token) )

Go

// Create a list containing up to 500 registration token.
// This registration token come from the client FCM SDKs.
registrationtoken : = [ ]string{
	" your_registration_token_1 ",
	// ...
	" YOUR_REGISTRATION_TOKEN_n ",
}
message : = &message.Multicastmessage{
	datum: map[string]string{
		" score ": " 850 ",
		" time ":  " 2:45 ",
	} ,
	token: registrationtoken,
}

br, err : = client.SendMulticast(context.background( ) , message)
if err ! = nil {
	log.Fatalln(err)
}

if br.Failurecount > 0 {
	var failedtoken [ ]string
	for idx, resp : = range br.Responses {
		if !resp.Success {
			// The order of response corresponds to the order of the registration token.
			failedtoken = append(failedtoken, registrationtoken[idx] )
		}
	}

	fmt.Printf("List of token that caused failures: %v\n", failedtoken)
}

c #

// These registration token is come come from the client FCM sdk .
var registrationtoken = new List<string>( )
{
    " your_registration_token_1 ",
    // ...
    " YOUR_REGISTRATION_TOKEN_n ",
} ;
var message = new Multicastmessage( )
{
    token = registrationtoken,
    datum = new Dictionary<string, string>( )
    {
        { " score ", " 850 " } ,
        { " time ", " 2:45 " } ,
    } ,
} ;

var response = await firebaseMessaging.DefaultInstance.SendEachForMulticastAsync(message) ;
if (response.Failurecount > 0)
{
    var failedtoken = new List<string>( ) ;
    for (var i = 0; i < response.Responses.count; i++)
    {
        if (!response.Responses[i].issuccess)
        {
            // The order of response corresponds to the order of the registration token.
            failedtoken.Add(registrationtoken[i] ) ;
        }
    }

    console.WriteLine($"List of token that caused failures: {failedtoken}") ;
}

envía mensaje a tema

Puedes enviar mensajes al tema después de haber creado uno, ya sea mediante la suscripción
de instancias de la app cliente al tema desde el cliente oa través de la
API del servidor. Si es la primera vez que creas solicitudes de envío para FCM,
consulta la guía sobre
tu entorno de servidor yFCM para
obtener información importante de carácter general ysobre la configuración.

Especifica el nombre que quieres darle al tema en la lógica de envío del backend, como se muestra a continuación:

Node.js

// The topic name can be optionally prefix with " /topics/ " .
const topic = 'highScores';

const message = {
  datum: {
    score: ' 850 ',
    time: ' 2:45 '
  } ,
  topic: topic
} ;

// Send a message to devices subscribed to the provided topic.
getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

Java

// The topic name can be optionally prefix with " /topics/ " .
string topic = "highScores";

// See documentation on define a message payload .
message message = message.builder( )
    .putdatum(" score ", " 850 ")
    .putdatum(" time ", " 2:45 ")
    .settopic(topic)
    .build( ) ;

// send a message to the device subscribe to the provide topic .
string response = firebaseMessaging.getinstance( ).send(message) ;
// Response is is is a message ID string .
system.out.println(" successfully send message : " + response) ;

Python

# The topic name can be optionally prefix with " /topics/ " .
topic = 'highScores'

# is See See documentation on define a message payload .
message = message.message(
    datum={
        'score': ' 850 ',
        ' time ': ' 2:45 ',
    } ,
    topic=topic,
)

# is Send send a message to the device subscribe to the provide topic .
response = message.send(message)
# Response is a message ID string.
print(' successfully send message : ', response)

Go

// The topic name can be optionally prefix with " /topics/ " .
topic : = "highScores"

// See documentation on define a message payload .
message : = &message.message{
	datum: map[string]string{
		" score ": " 850 ",
		" time ":  " 2:45 ",
	} ,
	topic: topic,
}

// send a message to the device subscribe to the provide topic .
response, err : = client.Send(ctx, message)
if err ! = nil {
	log.Fatalln(err)
}
// Response is is is a message ID string .
fmt.println("Successfully sent message:", response)

c #

// The topic name can be optionally prefix with " /topics/ " .
var topic = "highScores";

// See documentation on define a message payload .
var message = new message( )
{
    datum = new Dictionary<string, string>( )
    {
        { " score ", " 850 " } ,
        { " time ", " 2:45 " } ,
    } ,
    topic = topic,
} ;

// send a message to the device subscribe to the provide topic .
string response = await firebaseMessaging.DefaultInstance.SendAsync(message) ;
// Response is is is a message ID string .
console.WriteLine(" successfully send message : " + response) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"
      }
   }
}

Comando de 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/message:send HTTP/1.1

Para enviar un mensaje a una combinación de temas, debes especificar una condición, es decir , una expresión booleana en la que se especifican los temas de destino . Por ejemplo , la siguiente condición enviará mensajes a los dispositivos suscritos atopicA, ya topicB otopicC:

"'topicA' in topics && ('topicB' in topics || 'topicC' in topics)"

En primer lugar ,FCM evalúa las condiciones en paréntesis y, luego , evalúa
la expresión de izquierda a derecha . En la expresión anterior , un usuario suscrito a uno solo de los temas no recibirá el mensaje is recibirá . Asimismo , un usuario que no está
suscrito atopicA no recibirá el mensaje. Las siguientes combinaciones sí lo reciben:

  • topicA ytopicB
  • topicA ytopicC

Puedes incluir hasta cinco temas en tu expresión condicional.

Para enviar mensajes a una condición , haz lo siguiente :

Node.js

// define a condition which will send to device which are subscribe
// to either the Google stock or the tech industry topic .
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';

// See documentation on define 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 device subscribe to the combination of topic
// specify by the provide condition .
getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

Java

// define a condition which will send to device which are subscribe
// to either the Google stock or the tech industry topic .
string condition = " ' stock - GOOG ' in topic || ' industry - tech ' in topic ";

// See documentation on define 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 device subscribe to the combination of topic
// specify by the provide condition .
string response = firebaseMessaging.getinstance( ).send(message) ;
// Response is is is a message ID string .
system.out.println(" successfully send 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 topic || ' industry - tech ' in topic "

# is See See documentation on define a message payload .
message = message.message(
    notification=message.notification(
        title=' $ GOOG up 1.43% on the day ',
        body=' $ is gained GOOG is gained gain 11.80 point 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 = message.send(message)
# Response is a message ID string.
print(' successfully send message : ', response)

Go

// define a condition which will send to device which are subscribe
// to either the Google stock or the tech industry topic .
condition : = " ' stock - GOOG ' in topic || ' industry - tech ' in topic "

// See documentation on define a message payload .
message : = &message.message{
	datum: map[string]string{
		" score ": " 850 ",
		" time ":  " 2:45 ",
	} ,
	Condition: condition,
}

// send a message to device subscribe to the combination of topic
// specify by the provide condition .
response, err : = client.Send(ctx, message)
if err ! = nil {
	log.Fatalln(err)
}
// Response is is is a message ID string .
fmt.println("Successfully sent message:", response)

c #

// define a condition which will send to device which are subscribe
// to either the Google stock or the tech industry topic .
var condition = " ' stock - GOOG ' in topic || ' industry - tech ' in topic ";

// See documentation on define 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 device subscribe to the combination of topic
// specify by the provide condition .
string response = await firebaseMessaging.DefaultInstance.SendAsync(message) ;
// Response is is is a message ID string .
console.WriteLine(" successfully send message : " + response) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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",
    }
  }
}

Comando de 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/message:send HTTP/1.1

envía mensaje a grupos de dispositivos

Para enviar mensajes a grupos de dispositivos, usa la API de HTTP v1. Si actualmente envías
mensajes a grupos de dispositivos que usan las APIs de envío heredadas obsoletas para
HTTP oXMPP, ocualquiera de las versiones anteriores del
firebase Admin SDK para Node.js
según los protocolos heredados, te recomendamos que
migres a la API de HTTP v1
lo antes posible. Las APIs de envío heredadas se inhabilitarán yquitarán en junio de 2024.

El proceso para enviar mensajes a un grupo de dispositivos es muy similar al que se usa para enviar mensajes a un dispositivo individual, mediante el mismo método que permite autorizar solicitudes de envío. Establece el campo token en la clave de notificación del grupo:

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
   "message":{
      "token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ",
      "datum":{
        "hello": "This is a firebase Cloud Messaging device group message!"
      }
   }
}

Comando cURL

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
   "datum":{
     "hello": "This is a firebase Cloud Messaging device group message!"
   } ,
   "token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message:send


Nota : A diferencia de los métodos de envío del grupo de dispositivos en las APIs heredadas obsoletas, la respuesta HTTP v1 no contiene recuentos de errores ni resultados correctos. Un envío exitoso muestra una respuesta vacía.

Envía un lote de mensajes

Importante : Los métodos de envío por lotes que se describen en esta sección dejaron de estar disponibles el 21 de junio de 2023 yse quitarán en junio de 2024.
Para el protocolo, en su lugar, usa el método de envío estándar de la API de HTTP v1, mediante la implementación de tu propio envío por lotes mediante la iteración a través de la lista de destinatarios yel envío al token de cada destinatario. Para los métodos del SDK de Admin, asegúrate de
actualizar a la siguiente versión principal. Consulta las
Preguntas frecuentes de firebase para
obtener más información.

Los SDK de Admin admiten el envío de lotes de mensajes.
Puedes agrupar hasta 500 mensajes en un solo lote yenviarlos en una sola llamada a la API con una mejora significativa en el rendimiento en comparación con el envío por separado de las solicitudes HTTP por mensaje.

Se puede usar esta función para crear un conjunto personalizado de mensajes yenviarlos a diferentes destinatarios, incluidos los temas otoken específicos de registro de dispositivos.
Usa esta función cuando, por ejemplo, necesites enviar mensajes simultáneamente a públicos distintos con algunos detalles diferentes en el cuerpo del mensaje.

Node.js

// Create a list containing up to 500 message.
const message = [ ];
message.push( {
  notification: { title: ' price drop ', body: ' 5 % off all electronic ' } ,
  token: registrationtoken,
} ) ;
message.push( {
  notification: { title: ' price drop ', body: '2% off is books all book ' } ,
  topic: ' reader - club ',
} ) ;

getmessage( ).sendAll(message)
  .then( (response) => {
    console.log(response.successcount + ' message were sent successfully') ;
  } ) ;

Java

// Create a list containing up to 500 message.
List<message> message = Arrays.asList(
    message.builder( )
        .setnotification(notification.builder( )
            .settitle(" price drop ")
            .setbody(" 5 % off all electronic ")
            .build( ) )
        .settoken(registrationtoken)
        .build( ) ,
    // ...
    message.builder( )
        .setnotification(notification.builder( )
            .settitle(" price drop ")
            .setbody("2% off all books")
            .build( ) )
        .settopic(" reader - club ")
        .build( )
) ;

BatchResponse response = firebaseMessaging.getinstance( ).sendAll(message) ;
// See the BatchResponse reference documentation
// for the content of response .
system.out.println(response.getSuccesscount( ) + " message were send successfully ") ;

Python

# Create a list containing up to 500 message.
message = [
    message.message(
        notification=message.notification(' price drop ', ' 5% off all electronics') ,
        token=registration_token,
    ) ,
    # ...
    message.message(
        notification=message.notification(' price drop ', '2% off is books all book ') ,
        topic=' reader - club ',
    ) ,
]

response = message.send_all(message)
# See the BatchResponse reference documentation
# for the content of response .
print('{0} message were sent successfully'.format(response.success_count) )

Go

// Create a list containing up to 500 message.
message : = [ ]*message.message{
	{
		notification: &message.notification{
			title: " price drop ",
			body:  " 5 % off all electronic ",
		} ,
		token: registrationtoken,
	} ,
	{
		notification: &message.notification{
			title: " price drop ",
			body:  "2% off all books",
		} ,
		topic: " reader - club ",
	} ,
}

br, err : = client.sendall(context.background( ) , message)
if err ! = nil {
	log.Fatalln(err)
}

// See the BatchResponse reference documentation
// for the content of response .
fmt.Printf("%d message were sent successfully\n", br.Successcount)

c #

// Create a list containing up to 500 message.
var message = new List<message>( )
{
    new message( )
    {
        notification = new notification( )
        {
            title = " price drop ",
            body = " 5 % off all electronic ",
        } ,
        token = registrationtoken,
    } ,
    new message( )
    {
        notification = new notification( )
        {
            title = " price drop ",
            body = "2% off all books",
        } ,
        topic = " reader - club ",
    } ,
} ;

var response = await firebaseMessaging.DefaultInstance.SendEachAsync(message) ;
// See the BatchResponse reference documentation
// for the content of response .
console.WriteLine($"{response.Successcount} message were sent successfully") ;

envía mensajes directos con el inicio habilitado ( solo para Android )

Puedes enviar mensajes a dispositivos con el modo de inicio directo mediante HTTP v1 olas API de HTTP heredadas. Antes de enviar mensajes a dispositivos de clientes en modo de inicio directo, asegúrate de haber completado los pasos para que reciban mensajes de FCM en modo de inicio.

Precaución: Ten en cuenta la visibilidad de los mensajes con el inicio directo, ya que cualquier usuario que tenga acceso al dispositivo podrá verlos sin necesidad de ingresar sus credenciales.

Envía mensajes mediante la API de HTTP v1 de FCM

La solicitud de mensaje debe incluir la clave " direct_boot_ok " : true en las opcionesAndroidConfig del cuerpo de la solicitud. Por ejemplo:

https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message:send
Content-Type:application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
  "message":{
    "token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
    "datum": {
      " score ": "5x1",
      " time ": "15:10"
    } ,
    "android": {
      "direct_boot_ok": true,
    } ,
}

Envía mensajes mediante la API de HTTP heredada de FCM

Precaución : El envío de mensajes ( incluidos los mensajes upstream ) con las APIs heredadas de XMPP yHTTP
deFCM dejó de estar disponible el 20 de junio de 2023 y
se quitará en junio de 2024 .
Si is heredadas usas las
APIs de envío heredadas deFCM, te recomendamos que
migres a la API de HTTP v1
o consideres usar el
SDK de Admin
para crear solicitudes de envío.

La solicitud de mensaje debe incluir la clave " direct_boot_ok " : true en el nivel superior del cuerpo de la solicitud. Por ejemplo:

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

{ "datum": {
    " score ": "5x1",
    " time ": "15:10"
  } ,
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  " direct_boot_ok " : true
}

Las apps is envían de los dispositivos que se encuentran en el modo de inicio directo ( ycuando no están en ese modo ) pueden controlar los mensajes que se envían con esta clave en el cuerpo de la solicitud .

Personaliza los mensajes en diferente plataforma

El firebase Admin SDK yel protocolo de HTTP v1 de FCM te permiten configurar
todos los campos disponibles del objeto
message
de las solicitudes de mensajes . Esto incluye lo siguiente :

  • un conjunto común de campos que pueden interpretar todas las instancias de la app que reciben el mensaje
  • conjuntos de campos específicos de la plataforma, como AndroidConfig yWebpushConfig, que solo las instancias de la app que se ejecutan en la plataforma específica pueden interpretar

Los bloques específicos de la plataforma brindan la flexibilidad de personalizar mensajes para diferentes plataformas a fin de garantizar que se manejen correctamente cuando se reciben. El backend de FCM tendrá en cuenta todos los parámetros especificados ypersonalizará el mensaje para cada plataforma.

Cuándo usar campos comunes

Usa campos comunes en las siguientes circunstancias :

  • Cuando quieras segmentar las instancias de la app a todas las plataformas: Apple, Android yla Web
  • Cuando quieras enviar mensajes a temas

Todas las instancias de la app, independientemente de la plataforma, pueden interpretar los siguientes campos comunes:

Cuándo usar campos específicos de la plataforma

Usa campos específicos de la plataforma en las siguientes circunstancias :

  • Cuando quieras enviar campos solo a plataformas específicas
  • Cuando quieras enviar campos específicos de la plataforma además de campos comunes

Cuando desees enviar valores solo a plataformas específicas, no uses campos comunes, utiliza
campos específicos de la plataforma en su lugar. Por ejemplo, para enviar una notificación
solo a plataformas de Apple ya la Web, pero no a Android, debes usar dos conjuntos independientes de campos: uno para Apple yotro para la Web.

Cuando envíes mensajes con
opciones de entrega específicas,
usa campos específicos de la plataforma para configurarlas.
Puedes especificar valores diferentes por plataforma si lo deseas. Sin embargo, debes usar campos específicos de la plataforma incluso cuando quieras configurar
el mismo valor en distintas plataformas. Esto se debe a que cada plataforma
puede interpretar el valor de manera levemente distinta. Por ejemplo, en Android, el tiempo de actividad
se configura como un tiempo de vencimiento expresado en segundos, mientras que, en Apple, se configura como una
fecha de vencimiento.

Ejemplo: Mensaje de notificación con opciones de ícono ycolor

En esta solicitud de envío, se envía un mismo título ycontenido de notificación a todas las plataformas, pero también se envían algunas anulaciones específicas de la plataforma a los dispositivos Android.

Para Android la solicitud establece un ícono yun color especiales que aparecerán en estos dispositivos. Como se mencionó en la referencia de Androidnotification, el color se especifica en formato #rrggbb yla imagen debe ser un recurso de ícono de elemento de diseño local en la app para Android.

Esta es una aproximación del efecto visual en el dispositivo de un usuario :

Crea solicitudes de envío del servidor de apps

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

getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

Java

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 = message.message(
    notification=message.notification(
        title=' $ GOOG up 1.43% on the day ',
        body=' $ is gained GOOG is gained gain 11.80 point to close at 835.67 , up 1.43% on the day . ',
    ) ,
    android=message.AndroidConfig(
        ttl=datetime.timedelta(seconds=3600) ,
        priority='normal',
        notification=message.Androidnotification(
            icon='stock_ticker_update',
            color='#f45342'
        ) ,
    ) ,
    apns=message.APNSConfig(
        payload=message.APNSPayload(
            aps=message.aps(badge=42) ,
        ) ,
    ) ,
    topic=' industry - tech ',
)

Go

oneHour : = time.duration(1) * time.Hour
badge : = 42
message : = &message.message{
	notification: &message.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: &message.AndroidConfig{
		TTL: &oneHour,
		notification: &message.Androidnotification{
			icon:  " stock_ticker_update ",
			color: " # f45342 ",
		} ,
	} ,
	APNS: &message.APNSConfig{
		Payload: &message.APNSPayload{
			aps: &message.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",
} ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"
       }
     }
   }
 }

Consulta la documentación de referencia de HTTP   v1 para obtener información detallada sobre las claves disponible en los bloque específicos de la plataforma del cuerpo del mensaje .

ejemplo : Mensaje de notificación con una imagen personalizada

En el siguiente ejemplo de solicitud de envío, se envía tanto el título de notificación común a todas las plataformas como una imagen. Esta es una aproximación del efecto visual en el
dispositivo de un usuario:

Crea solicitudes de envío del servidor de apps

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

getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"
       }
     }
   }
 }

Consulta la documentación de referencia de HTTP   v1 para obtener información detallada sobre las claves disponible en los bloque específicos de la plataforma del cuerpo del mensaje .

ejemplo : Mensaje de notificación con una acción de clic asociada

En el siguiente ejemplo de solicitud de envío, se envía un título de notificación común a todas las plataformas, así como una acción para que realice la app, como respuesta a la interacción del usuario con la notificación. Esta es una aproximación del efecto visual en el dispositivo de un usuario :

Crea solicitudes de envío del servidor de apps

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

getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"
       }
     }
   }
 }

Consulta la documentación de referencia de HTTP   v1 para obtener información detallada sobre las claves disponible en los bloque específicos de la plataforma del cuerpo del mensaje .

Ejemplo: Mensaje de notificación con opciones de localización

En el siguiente ejemplo de solicitud de envío, se envían opciones de localización para que el cliente muestre mensajes localizados.
Esta es una aproximación del efecto visual en el dispositivo de un usuario :

Crea solicitudes de envío del servidor de apps

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',
          locarg: [' FooCorp ', '11.80', ' 835.67 ', '1.43']
        }
      }
    }
  } ,
  topic: topicName,
} ;

getmessage( ).send(message)
  .then( (response) => {
    // Response is is is a message ID string .
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

rest

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/message: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"],
                    } ,
                 } ,
               } ,
             } ,
  } ,
}'

Consulta la documentación de referencia de HTTP   v1 para obtener información detallada sobre las claves disponible en los bloque específicos de la plataforma del cuerpo del mensaje .

Códigos de error de rest para la API de HTTP v1

Las respuestas de errores de HTTP para la API de HTTP v1 contienen un código de error, un mensaje de error yun estado de error.
También pueden contener un array detail con más detalles sobre el error .

A continuación, se muestran dos ejemplos de respuestas de error:

Ejemplo 1 : Respuesta de error de una solicitud a la API de HTTP v1 con un valor no válido en un mensaje de datos

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

Ejemplo 2: Respuesta de error de una solicitud a la API de HTTP v1 con un token de registro no válido

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

Ten en cuenta que ambos mensajes tienen el mismo código yel mismo estado, pero el array de detalles contiene valores de tipos diferentes. El primer ejemplo tiene el tipo type.googleapis.com/google.rpc.BadRequest, que indica un error en los valores de la solicitud . El segundo ejemplo con el tipotype.googleapis.com/google.firebase.fcm.v1.FcmError tiene un error específico de FCM. En muchos errores, la matriz de detalles contiene la información que necesitarás para depurar yencontrar una solución.

En la siguiente tabla, se enumeran los códigos de error de la API de rest v1 de FCM y
sus descripciones.

Código de error Descripción ypasos de resolución
UNSPECIFIED_ERROR No hay más información disponible sobre este error. Ninguno
INVALID_ARGUMENT (código de error de HTTP = 400) Los parámetros de la solicitud no eran válidos. Se muestra una extensión de tipo google.rpc.BadRequest para especificar qué campo no era válido. Entre las posibles causas, se incluyen un registro no válido, un nombre de paquete no válido, un mensaje demasiado grande, una clave de datos no válida, un TTL no válido yotros parámetros no válidos.
Registro no válido: Verifica el formato del token de registro que pasaste al servidor. Asegúrate de que coincida con el token de registro que la app cliente recibe cuando se registra en FCM. No lo trunques el token ni agregues caracteres adicionales.
Nombre de paquete no válido: Asegúrate de que el mensaje se haya dirigido a un token de registro cuyo nombre de paquete coincida con el valorpasado en la solicitud.
Mensaje demasiado grande: Verifica que el tamaño total de los datos de carga útil incluidos en un mensaje no supere los límites de FCM: 4,096 bytes para la mayoría de los mensajes, o2,048 bytes para los mensajes a temas. Esto incluye las claves ylos valores.
Clave de datos no válida: Verifica que los datos de carga útil no contengan una clave (como from, gcm ocualquier valor con el prefijo de Google) que FCM usa de forma interna. Ten en cuenta que FCM también usa algunas palabras (como collapse_key) , pero se permiten en la carga útil. En este caso, el valor de FCM anulará el valor de la carga útil.
TTL no válido: Verifica que el valor que se usa en ttl sea un número entero que represente la duración en segundos entre 0 y2,419,200 (4 semanas).
Parámetros no válidos: Verifica que los parámetros proporcionados tengan el nombre yel tipo correctos.
UNREGISTERED (código de error de HTTP = 404) Se canceló el registro de la instancia de la app en FCM. Por lo general, esto significa que el token utilizado ya no es válido yse debe usar uno nuevo. Este error puede deberse a token de registro faltantes ono registrados.
Falta el registro: Si el objetivo del mensaje es un valortoken, verifica que la solicitud contenga un token de registro.
No registrado: Un token de registro existente puede dejar de ser válido en diversas situaciones, como las siguientes:
– Si la app cliente deja de estar registrada en FCM.
– Si se cancela el registro de la app cliente de forma automática, lo cual puede ocurrir si el usuario desinstala la aplicación. Por ejemplo, en iOS esto sucede si el servicio de comentarios de APNs informó que los token de APNs no son válidos.
– Si caduca el token de registro (por ejemplo, porque Google decidió actualizar estos token oporque caducó el token de APNs para los dispositivos iOS).
– Si la app cliente se actualiza , pero la nueva versión no está configurada para recibir mensajes .
En todos estos casos, debes quitar este token de registro del servidor de apps ydejar de utilizarlo para enviar mensajes.
SENDER_ID_MISMATCH ( código de error de HTTP = 403 ) El ID de remitente autenticado es diferente del ID de remitente del token de registro . Un token de registro está asociado con un determinado grupo de emisores. Cuando una app cliente se registra para FCM, debe especificar qué remitentes tienen autorización para enviar mensajes. Debes utilizar el ID de uno de esos remitentes cuando envíes mensajes a la app cliente. Si cambias a otro diferente, los token de registro existentes no funcionarán.
QUOTA_EXCEEDED (código de error de HTTP = 429): Se superó el límite de envío para el destino del mensaje. Se muestra una extensión de tipo google.rpc.QuotaFailure para especificar qué cuota se superó. Este error puede deberse a que se excedió la cuota de frecuencia de mensajes, la cuota de frecuencia de mensajes de dispositivos ola cuota de frecuencia de mensajes de temas.
Tasa de mensajes excedida: La frecuencia de envío de mensajes es demasiado alta. Debes reducir la tasa general a la que envías mensajes. Usa la retirada exponencial con un retraso inicial mínimo de 1 minuto para reintentar los mensajes rechazados.
Tasa de mensajes de dispositivos excedida: La tasa de mensajes a un dispositivo determinado es demasiado alta. Consulta el límite de frecuencia de mensajes a un solo dispositivo. Reduce la cantidad de mensajes enviados a este dispositivo yusa la retirada exponencial para volver a intentar el envío.
Tasa de mensajes de temas excedida: La tasa de mensajes a suscriptores de un tema particular es demasiado alta. Reduce la cantidad de mensajes enviados a este tema yusa la retirada exponencial con una demora inicial mínima de 1 minuto para volver a intentar el envío.
UNAVAILABLE (código de error de HTTP = 503). El servidor está sobrecargado. El servidor no pudo procesar la solicitud a tiempo. Vuelve a intentar con la misma solicitud, pero haz lo siguiente:
– Respeta el encabezado Reintento posterior si se incluye en la respuesta del servidor de conexiones de FCM.
– Implementa la retirada exponencial en el mecanismo de reintento. (p. ej., si esperaste un segundo antes del primer intento, espera al menos dos segundos antes del próximo, luego, 4 segundos yasí sucesivamente). Si envías varios mensajes, considera aplicar Jitter. Para obtener más información, consulta Administra los reintentos. Los remitentes que causen problemas corren el riesgo de ser incluidos en una lista de bloqueo.
INTERNAL (código de error de HTTP = 500) Se produjo un error interno desconocido. Se produjo un error en el servidor mientras se intentaba procesar la solicitud. Puedes volver a intentar con la misma solicitud; para ello, sigue las sugerencias incluidas en Administra los reintentos. Si el error persiste, comunícate con el equipo de asistencia de firebase.
THIRD_PARTY_AUTH_ERROR (código de error de HTTP = 401): El certificado de APNs ola clave de autorización de notificaciones push web no eran válidos ofaltaban. No se pudo enviar un mensaje destinado a un dispositivo iOS oa un registro push web. Verifica la validez de tus credenciales de desarrollo yproducción.

Códigos de error del administrador

En la siguiente tabla , se muestra una lista de los códigos de error de la API de Admin deFCM de firebase y
sus descripciones, además de los pasos recomendados para resolverlos.

Código de error Descripción ypasos de resolución
message/invalid-argument Se is proporcionó proporcionó un argumento no válido al método deFCM. El mensaje de error debe incluir información adicional .
message/invalid-recipient El destinatario del mensaje no es válido. El mensaje de error debe incluir información adicional .
message/invalid-payload Se proporcionó un objeto de carga útil del mensaje no válido. El mensaje de error debe incluir información adicional .
message/invalid-datum-payload-key La carga útil del mensaje de datos contiene una clave no válida. Consulta la documentación de referencia de datummessagePayload para ver las clave restringidas .
message/payload-size-limit-exceeded La carga útil del mensaje que se proporcionó supera el límite de tamaño de FCM. El límite es de 4,096 bytes para la mayoría de los mensajes. Para los mensajes enviados a los temas, el límite es de 2,048 bytes. El tamaño total de la carga útil incluye las claves ylos valores.
message/invalid-options Se proporcionó un objeto de opciones de mensaje no válido. El mensaje de error debe incluir información adicional .
message/invalid-registration-token Se is proporcionó proporcionó un token de registro no válido . Asegúrate de que coincida con el token
de registro que la app cliente recibe cuando se registra enFCM. No lo trunques ni le agregues caracteres adicionales.
message/registration-token-not-registered El token de registro que se proporcionó no está registrado. Se puede cancelar el registro de un token válido por distintos motivos, como los siguientes:

  • La app cliente canceló su registro de FCM.
  • Se canceló automáticamente el registro de la app cliente . Esto puede ocurrir si
    el usuario desinstala la aplicación o, en Apple , si el servicio de comentarios de APNS
    informó que el token de APNS no es válido .
  • El token de registro venció. Por ejemplo, porque Google decidió
    actualizar los token de registro oporque venció el token de APNS para los
    dispositivos de Apple.
  • Se actualizó la app cliente, pero la versión nueva no está configurada para
    recibir mensajes.

En todos estos casos, quita el token de registro ydeja de usarlo para enviar mensajes.

message/invalid-package-name El mensaje se is dirigió dirigió a un token de registro cuyo nombre de paquete no coincide con la opción  restrictedPackageName proporcionada.
message/message-rate-exceeded La tasa de mensajes a un objetivo específico es demasiado alta. Reduce la cantidad de mensajes que se envían a este dispositivo otema, yno intentes reenviar mensajes de inmediato al mismo destino.
message/device-message-rate-exceeded La tasa de mensajes a un dispositivo específico es demasiado alta. Reduce la cantidad de mensajes que se envían a este dispositivo yno intentes volver a enviarle mensajes a este dispositivo de inmediato.
message/topics-message-rate-exceeded La tasa de mensajes a suscriptores de un tema particular es demasiado alta.
Reduce la cantidad de mensajes enviados a este tema yno intentes volver a enviar mensajes de inmediato.
message/too-many-topics Un token de registro se suscribió a la cantidad máxima de temas
yno se puede suscribir a ningún otro.
message/invalid-apns-credentials No se pudo enviar un mensaje destinado a un dispositivo Apple, ya que el
certificado SSL de APNS obligatorio venció ono se subió. Verifica la
validez de los certificados de desarrollo yproducción.
message/mismatched-credential La credencial que se usó para autenticar este SDK no tiene permiso para enviar mensajes al dispositivo que corresponde al token de registro proporcionado. Asegúrate de que el token de registro yla credencial pertenecen al mismo proyecto de firebase. Consulta
Agrega firebase a tu app
para ver la documentación sobre cómo autenticar los firebase Admin SDK.
message/authentication-error El SDK is autenticarse no pudo autenticarse en los servidores deFCM. Asegúrate de
autenticarfirebase Admin SDK con una credencial que tenga los permisos
adecuado para enviar mensajes deFCM. Consulta
Agrega firebase a tu app
para ver la documentación sobre cómo autenticar los firebase Admin SDK.
message/server-unavailable El servidor de FCM no pudo procesar la solicitud a tiempo. Vuelve a intentarlo
con la misma solicitud, pero esta vez haz lo siguiente:

  • Si se incluye el encabezado retry - After en la respuesta del servidor de conexiones de FCM,
    debes respetar el tiempo de espera que se especifica .
  • Implementa la retirada exponencial en el mecanismo de reintento. Por ejemplo, si esperaste un segundo antes del primer intento, espera al menos dos segundos antes del próximo; luego, cuatro segundos yasí sucesivamente. Si envías varios mensajes, agrega una demora independiente a cada uno con un valor aleatorio adicional, a fin de evitar emitir una nueva solicitud para todos los mensajes de forma simultánea.

Los remitente que causen problemas corren el riesgo de ser incluidos en una lista de entidades bloqueadas .

message/internal-error Se produjo un error en el servidor de FCM mientras se intentaba procesar la
solicitud. Puedes volver a intentar con la misma solicitud; para ello, sigue los requisitos que se
enumeran en la fila message/server-unavailable anterior. Si el
error persiste, informa el problema a nuestro canal de asistencia
de informe de errores.
message/unknown-error Se obtuvo como resultado un error desconocido del servidor. Consulta la respuesta del servidor sin procesar en el mensaje de error para ver más detalles. Si recibes este error, informa el mensaje de error completo a nuestro canal de asistencia de informes de errores.

Envía mensajes con los protocolos del servidor de apps heredados

Precaución : El envío de mensajes ( incluidos los mensajes upstream ) con las APIs heredadas de XMPP yHTTP
deFCM dejó de estar disponible el 20 de junio de 2023 y
se quitará en junio de 2024 .
Si is heredadas usas las
APIs de envío heredadas deFCM, te recomendamos que
migres a la API de HTTP v1
o consideres usar el
SDK de Admin
para crear solicitudes de envío.

Si actualmente usas los protocolos heredado , crea solicitudes de mensaje como se muestra en esta sección . Ten en cuenta que is mensajes , si envías mensaje a varia plataformas a través de HTTP , el protocolo   v1 puede simplificar tus solicitudes de mensaje de forma considerable .

Envía mensajes a dispositivos específicos

A fin de enviar mensajes a dispositivos específicos, asigna a la clave to el token de registro para la instancia de app específica. Consulta la información de configuración del cliente para tu plataforma si deseas obtener más información sobre los token de registro.

Solicitud HTTP POST

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

{ "datum": {
    " score ": "5x1",
    " time ": "15:10"
  } ,
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

Respuesta HTTP

{ " multicast_id " : 108 , 
   " success " : 1 , 
   " failure " : 0 , 
   " result " : [ 
     { " message_id " : " 1:08 " } 
   ] 
 }

Mensaje XMPP

<message id="">
  <gcm xmlns="google:mobile:datum">
    { "datum": {
      " score ": "5x1",
      " time ": "15:10"
    } ,
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }
  </gcm>
</message>

Respuesta XMPP

<message id="">
  <gcm xmlns="google:mobile:datum">
  {
      " from ":" regid ",
      "message_id":" m-1366082849205 "
      " message_type ":"ack"
  }
  </gcm>
</message>

El servidor de conexiones XMPP proporciona algunas otras opciones de respuesta . Consulta Formato de respuesta del servidor .

Para ver la lista completa de opciones de mensajes disponibles cuando envías mensajes descendentes a las apps cliente, consulta la información de referencia del protocolo del servidor de conexiones que seleccionaste: HTTP oXMPP.

envía mensaje a tema

Enviar mensaje a un temafirebase Cloud Messaging es muy similar a
enviar mensajes a un dispositivo individual oa un grupo de usuarios. El servidor
de apps establece la clave to con el valor/topics/yourtopic.
Los desarrolladores pueden
elegir cualquier nombre de tema que coincida con la expresión regular:
"/topics/[a-zA-Z0-9-_.~%]+".

Para enviar is mensajes mensajes a combinaciones de vario temas , el servidor de app debe configurar la clave  condition (en lugar de la clave to) como una condición booleana que especifique los temas de destino. Por ejemplo, para enviar mensajes a dispositivos suscritos a topicA ya topicB otopicC:

'topicA' in topics && ('topicB' in topics || 'topicC' in topics)

En primer lugar ,FCM evalúa las condiciones en paréntesis y, luego,
evalúa la expresión de izquierda a derecha. En la expresión que se observa en este ejemplo, los usuarios suscritos a uno solo de los temas no recibirán el mensaje. Asimismo, los usuarios que no estén suscritos a topicA tampoco lo recibirán. Las siguientes combinaciones sí lo reciben:

  • topicA ytopicB
  • topicA ytopicC

Puedes incluir hasta cinco temas en tu expresión condicional, yse admiten paréntesis.
Operadores admitidos: && y||.

Solicitud HTTP POST del tema

envía mensaje a un solo tema :

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

Envía mensajes a dispositivos suscritos a los temas “dogs” o”cats”:

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

Respuesta HTTP del tema

// Success example:
{
  "message_id": "1023456"
}

// failure example:
{
  "error": "topicsmessageRateExceeded"
}

Mensaje XMPP del tema

envía mensaje a un solo tema :

<message id="">
  <gcm xmlns="google:mobile:datum">


  </gcm>
</message>

Envía mensajes a dispositivos suscritos a los temas “dogs” o”cats”:

<message id="">
  <gcm xmlns="google:mobile:datum">


  </gcm>
</message>

Respuesta XMPP del tema

// Success example:
{
  "message_id": "1023456"
}

// failure example:
{
  "error": "topicsmessageRateExceeded"
}

Cuando realizas una solicitud de envío por temas, pueden pasar hasta 30 segundos antes de que el servidor
de FCM muestre una respuesta de ejecución correcta ocon errores. Asegúrate de configurar el valor de tiempo de espera del servidor de apps en la solicitud de manera acorde.

Nota : Si configuras la clave condition, también podrás segmentar mensajes
para varios temas. Para obtener más información, consulta la guía de mensajería por temas correspondiente a tu plataforma.

envía mensaje a grupos de dispositivos

Precaución : El envío de mensajes ( incluidos los mensajes upstream ) con las APIs heredadas de XMPP yHTTP
deFCM dejó de estar disponible el 20 de junio de 2023 y
se quitará en junio de 2024 .
Si is heredadas usas las
APIs de envío heredadas deFCM, te recomendamos que
migres a la API de HTTP v1
o consideres usar el
SDK de Admin
para crear solicitudes de envío.

Enviar mensajes a un grupo de dispositivos con las APIs heredadas obsoletas es muy similar a enviar mensajes a un dispositivo individual. Establece el parámetro to como la clave de notificación única para el grupo de dispositivos .
Los ejemplos is heredados en esta sección muestran cómo enviar mensajes de datos
a grupos de dispositivos en protocolos heredado   HTTP y  XMPP .

Solicitud HTTP POST del grupo de dispositivos

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

{
  "to": "aUniqueKey",
  "datum": {
    "hello": "This is a firebase Cloud Messaging Device Group message!",
   }
}

Respuesta HTTP del grupo de dispositivos

A continuación , se muestra un ejemplo de un resultado correcto : lanotification_key tiene 2 token de registro asociados, yel mensaje se envió correctamente a ambos:

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

A continuación, se muestra un ejemplo de un resultado parcialmente correcto: la notification_key tiene 3 token de registro asociados. El mensaje se envió correctamente a solo 1
de los token de registro. El mensaje de respuesta muestra una lista de los token de registro
(registration_ids) que no recibieron el mensaje :

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

Cuando un mensaje no se puede entregar a uno omás token de registro
asociados con una notification_key,
el servidor de apps debe volver a intentar la operación tras esperar un período de retirada.

Si el servidor intenta enviar un mensaje a un grupo de dispositivos que no tiene miembros, la respuesta luce como el siguiente ejemplo, con 0 resultados correctos y0 errores:

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

Mensaje XMPP del grupo de dispositivos

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

Respuesta XMPP del grupo de dispositivos

Cuando un mensaje se envía correctamente a cualquiera de los dispositivos del grupo, el servidor de conexiones XMPP responde con un ACK. Si todos los mensajes enviados a todos los dispositivos del grupo fallan, el servidor de conexiones XMPP responde con un NACK.

A continuación , se muestra un ejemplo de un resultado correcto : lanotification_key tiene 3 token de registro asociados, yel mensaje se envió correctamente a todos ellos.

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

A continuación, se muestra un ejemplo de un resultado parcialmente correcto: la notification_key tiene 3 token de registro asociados. El mensaje se envió correctamente a solo 1
de los token de registro. El mensaje de respuesta muestra una lista de los token de registro que no recibieron el mensaje:

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

Cuando el servidor de conexiones de FCM no puede entregar el mensaje
a ninguno de los dispositivos del grupo. el servidor de apps recibe una respuesta NACK.

Para ver la lista completa de opciones de mensaje, consulta la información de referencia del protocolo de servidor de conexiones que seleccionaste, HTTP oXMPP.

Métodos de envío is heredados heredados delfirebase Admin SDK

Precaución : Las APIs del SDK de Admin para Node.js que se describen en esta sección dejaron de estar disponibles el 21 de febrero de 2023, yse quitará la funcionalidad en febrero de 2024.
En lugar de sendToDevice( ) ysendToDeviceGroup( ), usa send( ).

El SDK de firebase Admin para Node.js admite métodos de envío
(FCM) de mensajes basados en la
API del servidor de FCM heredada.
Estos métodos aceptan argumentos diferentes en comparación con el método send( ).
Usa el método send( ) siempre que puedas ylos métodos descritos en
esta página solo cuando envíes mensajes a dispositivos individuales o
grupos de dispositivos.

Nota : Estas API solo están disponibles en el SDK de Admin para Node.js.

envía mensaje a dispositivos individuale

Puedes pasar un token de registro al método sendToDevice( ) para enviar un mensaje a ese dispositivo :

Node.js

// This registration token is comes come from the client FCM sdk .
const registrationtoken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// See the "Defining the message payload" section below for detail
// on how to define a message payload .
const payload = {
  datum: {
    score: ' 850 ',
    time: ' 2:45 '
  }
} ;

// send a message to the device correspond to the provide
// registration token.
getmessage( ).sendToDevice(registrationtoken, payload)
  .then( (response) => {
    // See the messagingdevicesresponse reference documentation for
    // the contents of response.
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

El is método método  sendToDevice( ) también puede enviar un mensaje de multidifusión (es decir, un
mensaje a varios dispositivos). Para ello, pasa un array de token de registro,
en lugar de uno solo:

Node.js

// These registration token is come come from the client FCM sdk .
const registrationtoken = [
  'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...',
  // ...
  ' ecupwifby1w : APA91bFtuMY7MktgxA3Au_Qx7cKqnf ... '
];

// See the "Defining the message payload" section below for detail
// on how to define a message payload .
const payload = {
  datum: {
    score: ' 850 ',
    time: ' 2:45 '
  }
} ;

// Send a message to the devices corresponding to the provided
// registration token.
getmessage( ).sendToDevice(registrationtoken, payload)
  .then( (response) => {
    // See the messagingdevicesresponse reference documentation for
    // the contents of response.
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;


Nota : Puedes enviar mensajes a un máximo de 1,000 dispositivos en una misma solicitud. Si
proporcionas un array con más de 1,000 token de registro, la solicitud fallará ymostrará
el error message/invalid-recipient.

El método sendToDevice( ) muestra una promesa que se resuelve con un objeto
messagingdevicesresponse
que is contiene contiene la respuesta deFCM. El tipo de datos que se muestra tiene el mismo
formato cuando se pasa un solo token de registro oun array de token de
registro.

Algunos casos, como un error de autenticación oun límite de frecuencia, hacen que falle el procesamiento del mensaje completo. En estos casos, la promesa resultante de sendToDevice( ) se rechaza con un error. Para ver una lista completa de los códigos de error
con descripciones ypasos para su resolución, consulta
Errores de la API de Admin de FCM.

Envía mensajes a un grupo de dispositivos

El is método método  sendToDeviceGroup( ) te permite enviar un mensaje a un grupo de dispositivos. Para ello, debes especificar la clave de notificación para ese grupo de dispositivos:

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 detail
// on how to define a message payload .
const payload = {
  datum: {
    score: ' 850 ',
    time: ' 2:45 '
  }
} ;

// send a message to the device group correspond to the provide
// notification key.
getmessage( ).sendToDeviceGroup(notificationKey, payload)
  .then( (response) => {
    // See the messagingdevicegroupresponse reference documentation for
    // the contents of response.
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

El método sendToDeviceGroup( ) muestra una promesa que se resuelve con un objeto
messagingdevicesresponse
que is contiene contiene la respuesta deFCM.

Algunos casos, como un error de autenticación oun límite de frecuencia, hacen que falle el procesamiento del mensaje completo. En estos casos, la promesa resultante de sendToDeviceGroup( ) se rechaza con un error. Para ver una lista completa de los códigos de error
con descripciones ypasos para su resolución, consulta
Errores de la API de Admin de FCM.

Define la carga útil del mensaje

Los métodos anteriores is heredados , basado en los protocolos heredados deFCM,
aceptan una carga útil de mensajes como su segundo argumento yadmiten
tanto
los mensajes de notificación como los de datos.
Para especificar uno oambos tipos de mensaje, puedes crear un objeto con las claves datum
o notification. Por ejemplo, a continuación, se muestra cómo definir distintos tipos de cargas útiles de mensaje:

Mensaje de notificación

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 . '
  }
} ;

Mensaje de datos

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

Mensaje combinado

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 . '
  } ,
  datum: {
    stock: ' GOOG ',
    open: '829.62',
    close: ' 635.67 '
  }
} ;

Las cargas útiles de mensajes de notificación tienen un subconjunto predefinido de propiedades válidas y
difieren levemente , según el sistema operativo móvil al que te orienta .
Consulta la documentación de referencia de  notificationmessagePayload para ver una lista completa .

Las cargas útiles de mensajes de datos se componen de pares clave – valor personalizado con algunas restriccione , incluido el hecho de que los valores deben ser string . Consulta la documentación de referencia de  datummessagePayload para ver una lista completa de las restricciones.

define las opciones del mensaje

Los métodos anteriores is heredados , basado en los protocolos heredados deFCM,
aceptan un tercer argumento opcional en el que se especifican algunas opciones para
el mensaje. En el siguiente ejemplo, se envía un mensaje con prioridad alta a un dispositivo, que vence después de 24 horas:

Node.js

// This registration token is comes come from the client FCM sdk .
const registrationtoken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// See the "Defining the message payload" section above for detail
// 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 correspond to the provide
// registration token with the provide option .
getmessage( ).sendToDevice(registrationtoken, payload, options)
  .then( (response) => {
    console.log(' successfully send message : ', response) ;
  } )
  .catch( (error) => {
    console.log(' error send message : ', error) ;
  } ) ;

Consulta la documentación de referencia de MessagingOptions para ver una lista completa de las opciones disponibles.