Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Configura una app cliente de Firebase Cloud Messaging en Android

A fin de escribir tu app cliente para Android de Firebase Cloud Messaging, usa la API de FirebaseMessaging y Android Studio 1.4 o versiones posteriores con Gradle. Las instrucciones que aparecen en esta página suponen que completaste los pasos para agregar Firebase a tu proyecto de Android.

Los clientes de FCM deben tener dispositivos con Android 4.1 o una versión más reciente que también tenga la app Google Play Store instalada o un emulador que ejecute Android 4.1 con las API de Google. Ten en cuenta que no estás limitado a implementar las apps para Android a través de Google Play Store.

Configura el SDK

Es posible que hayas completado tareas que aparecen en esta sección si ya habilitaste otras funciones de Firebase para tu app.

Antes de comenzar

  • Instala Android Studio o actualízalo a su versión más reciente.

  • Asegúrate de que tu proyecto cumpla con estos requisitos:

    • Se orienta al nivel de API 16 (Jelly Bean) o una versión posterior.
    • Usa Gradle 4.1 o una versión posterior.
    • Utiliza Jetpack (AndroidX), que incluye el cumplimiento de los siguientes requisitos de versión:
      • com.android.tools.build:gradle 3.2.1 o una versión posterior
      • compileSdkVersion 28 o una versión posterior
  • Configura un dispositivo físico o utiliza un emulador para ejecutar tu app.
    Los emuladores deben usar una imagen que cuente con Google Play.

  • Accede a Firebase con tu Cuenta de Google.

Si solo quieres probar un producto de Firebase, pero aún no tienes un proyecto de Android, puedes descargar una de estas muestras de inicio rápido.

Crea un proyecto de Firebase

Antes de poder agregar Firebase a tu app para Android, debes crear un proyecto de Firebase y conectarlo a la app. Visita Información sobre los proyectos de Firebase para obtener más detalles sobre este archivo de configuración.

Registra tu app en Firebase

Cuando tengas un proyecto de Firebase, podrás agregarle tu app para Android.

Consulta la Información sobre los proyectos de Firebase a fin de obtener detalles sobre prácticas recomendadas y consideraciones que debes tener para agregar apps a un proyecto de Firebase, entre ellas cómo manejar diversas variantes de compilación.

  1. Dirígete a Firebase console.

  2. En el centro de la página de descripción general del proyecto, haz clic en el ícono de Android () para iniciar el flujo de trabajo de configuración.

    Si ya agregaste una app a tu proyecto de Firebase, haz clic en Agregar app para que se muestren las opciones de la plataforma.

  3. Ingresa el nombre del paquete de tu app en el campo Nombre del paquete de Android.

  4. Ingresa otra información de la app como el sobrenombre y el certificado de firma SHA-1 de depuración (opcional).

  5. Haz clic en Registrar app.

Agrega un archivo de configuración de Firebase

  1. Agrega el archivo de configuración de Firebase para Android a la app, como se indica a continuación:

    1. Haz clic en Descargar google-services.json a fin de obtener el archivo de configuración de Firebase para Android (google-services.json).

    2. Transfiere tu archivo de configuración al directorio del módulo (nivel de app) de tu app.

  2. Agrega el complemento de google-services a tus archivos Gradle a fin de habilitar los productos de Firebase en tu app.

    1. Agrega reglas para incluir el complemento de servicios de Google al archivo Gradle (build.gradle) de nivel de raíz (a nivel de proyecto). Además, revisa que tengas el repositorio Maven de Google.

      buildscript {
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
        }
      
        dependencies {
          // ...
      
          // Add the following line:
          classpath 'com.google.gms:google-services:4.3.4'  // Google Services plugin
        }
      }
      
      allprojects {
        // ...
      
        repositories {
          // Check that you have the following line (if not, add it):
          google()  // Google's Maven repository
          // ...
        }
      }
      
    2. En el archivo Gradle (generalmente app/build.gradle) de tu módulo (a nivel de app), aplica el complemento Gradle de los servicios de Google:

      apply plugin: 'com.android.application'
      // Add the following line:
      apply plugin: 'com.google.gms.google-services'  // Google Services plugin
      
      android {
        // ...
      }
      

Agrega los SDK de Firebase a tu app

  1. En el archivo Gradle (generalmente app/build.gradle) de tu módulo (a nivel de app), agrega las dependencias de los productos Firebase que quieres usar en la app.

    Puedes agregar cualquiera de los productos de Firebase admitidos a tu app para Android.

    Para obtener una experiencia óptima con Firebase Cloud Messaging, te recomendamos que habilites Google Analytics en el proyecto. También debes agregar el SDK de Firebase para Google Analytics a la app cuando configures Analytics.

    Si Analytics está habilitado

    Java

    dependencies {
      // ...
    
      // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
      implementation 'com.google.firebase:firebase-messaging:20.3.0'
      implementation 'com.google.firebase:firebase-analytics:17.5.0'
    }
    
    // Getting a "Could not find" error? Make sure that you've added
    // Google's Maven repository to your project-level build.gradle file
    

    Kotlin+KTX

    dependencies {
      // ...
    
      // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
      implementation 'com.google.firebase:firebase-messaging-ktx:20.3.0'
      implementation 'com.google.firebase:firebase-analytics-ktx:17.5.0'
    }
    
    // Getting a "Could not find" error? Make sure that you've added
    // Google's Maven repository to your project-level build.gradle file
    

    Si Analytics está inhabilitado

    Java

    dependencies {
      // ...
    
      // Add the dependency for the Firebase Cloud Messaging library
      implementation 'com.google.firebase:firebase-messaging:20.3.0'
    }
    
    // Getting a "Could not find" error? Make sure that you've added
    // Google's Maven repository to your project-level build.gradle file
    

    Kotlin+KTX

    dependencies {
      // ...
    
      // Add the dependency for the Firebase Cloud Messaging library
      implementation 'com.google.firebase:firebase-messaging-ktx:20.3.0'
    }
    
    // Getting a "Could not find" error? Make sure that you've added
    // Google's Maven repository to your project-level build.gradle file
    
  2. Sincroniza tu app para garantizar que todas las dependencias tengan las versiones necesarias.

Edita el manifiesto de tu app

Agrega lo siguiente al manifiesto de tu app:

  • Un servicio que extienda FirebaseMessagingService. Esto es obligatorio si deseas administrar los mensajes además de recibir notificaciones en apps en segundo plano. Para recibir notificaciones en apps en primer plano, recibir la carga útil de datos, enviar mensajes ascendentes, etc., debes extender este servicio.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (Opcional) Dentro del componente de la aplicación, elementos de metadatos para configurar el ícono y el color predeterminados de la notificación. Android usa estos valores cada vez que los mensajes entrantes no tienen un ícono ni un color configurado de manera explícita.
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • (Opcional) A partir de Android 8.0 (nivel de API 26) y versiones más recientes, se admiten y se recomiendan los canales de notificaciones. FCM proporciona un canal de notificaciones predeterminado con configuración básica. Si prefieres crear y usar tu propio canal predeterminado, configura default_notification_channel_id con el ID de tu objeto de canal de notificaciones, como se muestra en el ejemplo. FCM usará este valor cada vez que los mensajes entrantes no tengan configurado un canal de notificaciones de manera explícita. Para obtener más información, consulta cómo administrar canales de notificaciones.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Accede al token de registro de dispositivo

Cuando se inicia tu app por primera vez, el SDK de FCM genera un token de registro para la instancia de la app cliente. Si el objetivo son dispositivos individuales o la creación de grupos de dispositivos, es necesario extender FirebaseMessagingService y anular onNewToken para acceder a este token.

En esta sección, se describe cómo recuperar el token y cómo supervisar los cambios que lo afectan. Debido a que el token se puede rotar después del primer inicio, te recomendamos enfáticamente que recuperes el token de registro con la actualización más reciente.

El token de registro puede cambiar en las siguientes situaciones:

  • La app se restablece en un dispositivo nuevo.
  • El usuario desinstala y vuelve a instalar la app.
  • El usuario borra los datos de la app.

Recupera el token de registro actual

Para recuperar el token actual, llama a FirebaseMessaging.getInstance().getToken().

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Supervisa la generación de tokens

La devolución de llamada de onNewToken se activa cuando se genera un token nuevo.

Java

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(token);
}

Kotlin+KTX

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(token)
}

Después de obtener el token, puedes enviarlo a tu servidor de apps y almacenarlo con tu método preferido.

Verificación de los Servicios de Google Play

Las apps que usan el SDK de los Servicios de Play siempre deben revisar el dispositivo para buscar un APK de Servicios de Google Play compatible antes de acceder a las funciones de los Servicios de Google Play. Se recomienda hacer esto en dos lugares: en el método onCreate() de la actividad principal y en su método onResume(). La verificación de onCreate() garantiza que la app no se pueda usar sin una verificación correcta. La verificación de onResume() garantiza que, si el usuario vuelve a la app en ejecución de alguna otra forma (por ejemplo, con el botón Atrás), la verificación se ejecute de todas formas.

Si el dispositivo no tiene una versión compatible de los Servicios de Google Play, tu app puede llamar a GoogleApiAvailability.makeGooglePlayServicesAvailable() para permitir que los usuarios descarguen tales servicios desde Play Store.

Evita la inicialización automática

Cuando se genera un token de registro de FCM, la biblioteca sube el identificador y los datos de configuración a Firebase. Si deseas evitar la autogeneración de tokens, inhabilita la inicialización automática para FCM y Analytics (es necesario inhabilitarla en ambos). Para ello, agrega estos valores de metadatos a AndroidManifest.xml:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Para volver a habilitar FCM, realiza una llamada de tiempo de ejecución:

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin+KTX

FirebaseMessaging.getInstance().isAutoInitEnabled = true

Este valor persiste en todos los reinicios de la app una vez establecido.

Próximos pasos

Cuando la app cliente esté configurada, estarás listo para comenzar a enviar mensajes descendentes con el Compositor de Notifications. Esta función se presenta en la muestra de inicio rápido, que puedes descargar, ejecutar y revisar.

Con el fin de agregar otro comportamiento más avanzado a tu app, puedes declarar un filtro de intents y, luego, implementar una actividad para responder a los mensajes entrantes. Para obtener información detallada, consulta las guías que explican cómo enviar mensajes desde un servidor de apps:

Ten en cuenta que para aprovechar estas funciones, necesitarás una implementación de servidor y los protocolos del servidor (HTTP o XMPP), o una implementación del SDK de Admin.