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>
<!-- 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" />
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:
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); } } }
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()
:
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(); } });
Supervisar la generación de tokens
La devolución de llamada onNewToken
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 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:
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 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 .