Entérate de todos los anuncios de Firebase Summit y descubre cómo Firebase puede ayudarte a acelerar el desarrollo de las apps y a ejecutarlas con confianza. Más información

Configurar una aplicación cliente de Firebase Cloud Messaging en Android

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Los clientes de FCM requieren dispositivos con Android 4.4 o superior que también tengan instalada la aplicación Google Play Store o un emulador que ejecute Android 4.4 con las API de Google. Tenga en cuenta que no está limitado a implementar sus aplicaciones de Android a través de Google Play Store.

Configurar el SDK

Esta sección cubre las tareas que puede haber completado si ya habilitó otras funciones de Firebase para su aplicación. Si aún no lo ha hecho, agregue Firebase a su proyecto de Android

Edite el manifiesto de su aplicación

Agregue lo siguiente al manifiesto de su aplicación:

  • Un servicio que amplía FirebaseMessagingService . Esto es necesario si desea realizar cualquier gestión de mensajes más allá de recibir notificaciones sobre aplicaciones en segundo plano. Para recibir notificaciones en aplicaciones en primer plano, recibir carga útil de datos, enviar mensajes ascendentes, etc., debe ampliar 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 establecer un ícono y color de notificación predeterminados. Android usa estos valores siempre que los mensajes entrantes no establezcan explícitamente un icono o un color.
  • <!-- 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 (API nivel 26) y superior, los canales de notificación son compatibles y recomendados. FCM proporciona un canal de notificación predeterminado con configuraciones básicas. Si prefiere crear y utilizar su propio canal predeterminado, establezca default_notification_channel_id en el ID de su objeto de canal de notificación como se muestra; FCM utilizará este valor siempre que los mensajes entrantes no establezcan explícitamente un canal de notificación. Para obtener más información, consulte Administrar canales de notificación .
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Solicitar permiso de notificación en tiempo de ejecución en Android 13+

Android 13 presenta un nuevo permiso de tiempo de ejecución para mostrar notificaciones. Esto afecta a todas las aplicaciones que se ejecutan en Android 13 o superior que usan notificaciones de FCM.

De forma predeterminada, el SDK de FCM (versión 23.0.6 o superior) incluye el permiso POST_NOTIFICATIONS definido en el manifiesto. Sin embargo, su aplicación también deberá solicitar la versión de tiempo de ejecución de este permiso a través de la constante android.permission.POST_NOTIFICATIONS . Su aplicación no podrá mostrar notificaciones hasta que el usuario haya otorgado este permiso.

Para solicitar el nuevo permiso de tiempo de ejecución:

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Kotlin+KTX

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Por lo general, debe mostrar una interfaz de usuario que explique al usuario las funciones que se habilitarán si otorgan permisos para que la aplicación publique notificaciones. Esta interfaz de usuario debe proporcionar al usuario opciones para aceptar o rechazar, como los botones Aceptar y No, gracias . Si el usuario selecciona Aceptar , solicitar directamente el permiso. Si el usuario selecciona No, gracias , permita que el usuario continúe sin notificaciones.

Consulte Permiso de tiempo de ejecución de notificaciones para obtener más prácticas recomendadas sobre cuándo su aplicación debe solicitar el permiso POST_NOTIFICATIONS del usuario.

Permisos de notificación para aplicaciones destinadas a Android 12L (nivel de API 32) o inferior

Android le pide permiso automáticamente al usuario la primera vez que su aplicación crea un canal de notificación, siempre que la aplicación esté en primer plano. Sin embargo, existen advertencias importantes con respecto al momento de la creación del canal y las solicitudes de permiso:

  • Si su aplicación crea su primer canal de notificación cuando se ejecuta en segundo plano (lo que hace el SDK de FCM cuando recibe una notificación de FCM), Android no permitirá que se muestre la notificación y no solicitará al usuario el permiso de notificación hasta el próximo hora en que se abre su aplicación. Esto significa que se perderán todas las notificaciones recibidas antes de que se abra su aplicación y el usuario acepte el permiso .
  • Le recomendamos enfáticamente que actualice su aplicación para orientarse a Android 13+ para aprovechar las API de la plataforma para solicitar permiso. Si eso no es posible, su aplicación debe crear canales de notificación antes de enviar notificaciones a la aplicación para activar el cuadro de diálogo de permiso de notificación y asegurarse de que no se pierda ninguna notificación. Consulte las mejores prácticas de permisos de notificación para obtener más información.

Opcional: eliminar el permiso POST_NOTIFICATIONS

De forma predeterminada, el SDK de FCM incluye el permiso POST_NOTIFICATIONS . Si su aplicación no usa mensajes de notificación (ya sea a través de notificaciones de FCM, a través de otro SDK o publicados directamente por su aplicación) y no desea que su aplicación incluya el permiso, puede eliminarlo usando el marcador de remove de fusión de manifiesto . Tenga en cuenta que eliminar este permiso impide que se muestren todas las notificaciones, no solo las notificaciones de FCM. Agregue lo siguiente al archivo de manifiesto de su aplicación:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

Acceder al token de registro del dispositivo

En el inicio inicial de su aplicación, el SDK de FCM genera un token de registro para la instancia de la aplicación cliente. Si desea apuntar a dispositivos individuales o crear grupos de dispositivos, deberá acceder a este token extendiendo FirebaseMessagingService y anulando onNewToken .

Esta sección describe cómo recuperar el token y cómo monitorear los cambios en el token. Debido a que el token se puede rotar después del inicio inicial, se recomienda enfáticamente recuperar el último token de registro actualizado.

El token de registro puede cambiar cuando:

  • La aplicación se restaura en un nuevo dispositivo
  • El usuario desinstala/reinstala la aplicación
  • El usuario borra los datos de la aplicación.

Recuperar el token de registro actual

Cuando necesite recuperar el token actual, llame 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()
})

Supervisar la generación de tokens

La devolución de llamada onNewToken cada vez que se genera un nuevo token.

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull 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
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Kotlin+KTX

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration 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
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

Una vez que haya obtenido el token, puede enviarlo a su servidor de aplicaciones y almacenarlo usando su método preferido.

Comprobar los servicios de Google Play

Las aplicaciones que dependen del SDK de Servicios de Play siempre deben verificar si el dispositivo tiene 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 en onCreate() garantiza que la aplicación no se pueda usar sin una verificación exitosa. La comprobación en onResume() garantiza que si el usuario vuelve a la aplicación en ejecución a través de otros medios, como mediante el botón Atrás, la comprobación aún se realiza.

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

Evitar la inicialización automática

Cuando se genera un token de registro de FCM, la biblioteca carga el identificador y los datos de configuración en Firebase. Si prefiere evitar la generación automática de tokens, deshabilite la recopilación de Analytics y la inicialización automática de FCM (debe deshabilitar ambas) agregando estos valores de metadatos a su 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 el inicio automático de FCM, realice una llamada en tiempo de ejecución:

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Para volver a habilitar la recopilación de Analytics, llama al método setAnalyticsCollectionEnabled() de la clase FirebaseAnalytics . Por ejemplo:

setAnalyticsCollectionEnabled(true);

Estos valores persisten en los reinicios de la aplicación una vez establecidos.

Próximos pasos

Una vez que la aplicación cliente está configurada, está listo para comenzar a enviar mensajes descendentes con el redactor de notificaciones . Esta funcionalidad se demuestra en el ejemplo de inicio rápido , que puede descargar, ejecutar y revisar.

Para agregar otro comportamiento más avanzado a su aplicación, puede declarar un filtro de intención e implementar una actividad para responder a los mensajes entrantes. Para obtener más información, consulte las guías para enviar mensajes desde un servidor de aplicaciones:

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