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

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 has hecho, agrega Firebase a tu proyecto de Android

Edita el manifiesto de tu aplicación

Agregue lo siguiente al manifiesto de su aplicación:

  • Un servicio que extiende FirebaseMessagingService . Esto es necesario si desea gestionar algún mensaje más allá de recibir notificaciones de aplicaciones en segundo plano. Para recibir notificaciones en aplicaciones en primer plano, recibir carga 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 icono y un color de notificación predeterminados. Android usa estos valores siempre que los mensajes entrantes no establezcan explícitamente un ícono o 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 superiores, se admiten y recomiendan canales de notificación . 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 introduce 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 y que utilizan notificaciones 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:

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

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

Generalmente, debe mostrar una interfaz de usuario que explique al usuario las funciones que se habilitarán si otorga 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 , solicite directamente el permiso. Si el usuario selecciona No, gracias , permítale continuar sin notificaciones.

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

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

Android solicita automáticamente permiso 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 la próxima vez. hora en que se abre su aplicación. Esto significa que cualquier notificación recibida antes de que se abra la aplicación y el usuario acepte el permiso se perderá .
  • Le recomendamos encarecidamente que actualice su aplicación para apuntar 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 cualquier notificación a la aplicación para activar el cuadro de diálogo de permiso de notificación y garantizar que no se pierdan notificaciones. 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 utiliza 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 remove del manifiesto de fusión . 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 encarecidamente recuperar el token de registro actualizado más reciente.

El token de registro podrá 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 necesites recuperar el token actual, llama FirebaseMessaging.getInstance().getToken() :

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

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

Monitorear la generación de tokens

La devolución de llamada onNewToken se activa cada vez que se genera un nuevo 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)
}

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

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

Buscar servicios de Google Play

Las aplicaciones que dependen del SDK de servicios de Play siempre deben verificar en el dispositivo un APK de servicios de Google Play compatible antes de acceder a las funciones de 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 utilizar sin una verificación exitosa. La verificación en onResume() garantiza que si el usuario regresa a la aplicación en ejecución por algún otro medio, como a través del botón Atrás, la verificació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 a los usuarios descargar los servicios de Google Play desde Play Store.

Prevenir 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:

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(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 durante los reinicios de la aplicación una vez establecidos.

Próximos pasos

Una vez configurada la aplicación cliente, estará listo para comenzar a enviar mensajes posteriores 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 de servidor y los protocolos de servidor (HTTP o XMPP), o una implementación del Admin SDK .