En esta guía de inicio rápido, se describe cómo configurar Firebase Cloud Messaging en tus apps cliente web y para dispositivos móviles para que puedas enviar mensajes de forma confiable. Para entornos de servidor, consulta El entorno del servidor y FCM.
Configura una app cliente de Firebase Cloud Messaging en Flutter
Según la plataforma a la que te orientes, deberás seguir algunos pasos de configuración adicionales.
iOS+
Swizzling de métodos
Para usar el complemento FCM de Flutter en dispositivos Apple, se requiere el swizzling de métodos. Sin ella, las funciones clave de Firebase, como el control de tokens de FCM, no funcionarán correctamente.
Android
Servicios de Google Play
Los clientes de FCM requieren dispositivos con Android 4.4 (o una versión más reciente) y los Servicios de Google Play instalados, o un emulador que ejecute Android 4.4 con las APIs de Google. Ten en cuenta que no estás limitado a implementar tus apps para Android a través de Google Play Store.
Las apps que usan el SDK de los Servicios de Play siempre deben revisar el dispositivo en busca de un
APK de los Servicios de Google Play compatible antes de acceder a las funciones de los
Servicios de Google Play. Se recomienda hacerlo 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.
Web
Configura las credenciales web con FCM
La interfaz web de FCM usa credenciales web llamadas "Identificación voluntaria del servidor de aplicaciones" (o claves "VAPID") para autorizar solicitudes de envío a servicios push web compatibles. Para suscribir tu app a las notificaciones push, debes asociar un par de claves a tu proyecto de Firebase. Puedes generar un nuevo par de claves o importar uno existente a través de Firebase console.
Instala el complemento de FCM
Instala e inicializa los complementos de Firebase para Flutter si aún no lo has hecho.
Desde la raíz de tu proyecto de Flutter, ejecuta el siguiente comando para instalar el complemento:
flutter pub add firebase_messaging
Cuando termines, vuelve a compilar tu aplicación de Flutter:
flutter run
Accede al token de registro
Para enviar un mensaje a un dispositivo específico, debes conocer el token de registro del dispositivo. Si quieres recuperar el token de registro actual de una instancia de app, llama a
getToken()
. Si no se otorgó el permiso de notificación, este método le
pedirá permisos de notificación al usuario. De lo contrario, se muestra un token o
se rechaza el futuro debido a un error.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
En plataformas web, pasa tu clave pública de VAPID a getToken()
:
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
Para recibir una notificación cada vez que se actualice el token, suscríbete al flujo de
onTokenRefresh
:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
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 prefieres que no se generen tokens automáticamente, inhabilita la inicialización automática durante el tiempo de compilación.
iOS
En iOS, agrega un valor de metadatos a Info.plist
:
FirebaseMessagingAutoInitEnabled = NO
Android
En Android, inhabilita la recopilación de Analytics y la inicialización automática de FCM (debes
inhabilitar ambas funciones). Para ello, agrega los siguientes valores de metadatos al archivo 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" />
Vuelve a habilitar el inicio automático de FCM durante el tiempo de ejecución
Si quieres habilitar la inicialización automática para una instancia de app específica, llama a setAutoInitEnabled()
:
await FirebaseMessaging.instance.setAutoInitEnabled(true);
Este valor persiste en todos los reinicios de la aplicación una vez establecido.
Envía un mensaje de notificación de prueba
- Instala y ejecuta la app en el dispositivo de destino. En los dispositivos Apple, tendrás que aceptar la solicitud de permiso para recibir notificaciones remotas.
- Asegúrate de que la app se encuentre en segundo plano en el dispositivo.
- En Firebase console, abre la página Messaging.
- Si este es tu primer mensaje, selecciona Crear la primera
campaña.
- Selecciona Mensajes de Firebase Notifications y, luego, Crear.
- De lo contrario, en la pestaña Campañas, selecciona Campaña nueva y, luego, Notificaciones.
- Ingresa el texto del mensaje.
- Selecciona Enviar mensaje de prueba en el panel derecho.
- En el campo Agregar un token de registro de FCM, ingresa tu token de registro.
- Selecciona Probar.
Después de seleccionar Probar, los dispositivos cliente de destino que tienen la app en segundo plano deberían recibir la notificación.
Para obtener estadísticas sobre la entrega de mensajes a tu app, consulta el panel de informes de FCM, en el que se registra la cantidad de mensajes que se enviaron y abrieron en dispositivos Apple y Android, junto con datos de impresiones para las apps para Android.
Controla las interacciones
Cuando los usuarios presionan una notificación, el comportamiento predeterminado en dispositivos iOS y Android es abrir la aplicación. Si la aplicación está cerrada, se iniciará y si está en segundo plano, pasará a primer plano.
Según el contenido de la notificación, es posible que quieras controlar la interacción del usuario cuando se abra la aplicación. Por ejemplo, si la notificación contiene un nuevo mensaje de chat y el usuario la selecciona, es posible que quieras que la aplicación se abra en la conversación específica.
El paquete firebase-messaging
proporciona dos formas de controlar esta interacción:
getInitialMessage():
: Si la aplicación se abre desde un estado finalizado, este método devuelve unFuture
que contiene unRemoteMessage
. Una vez que se consuma, se quitará elRemoteMessage
.onMessageOpenedApp
: Es unStream
que publica unRemoteMessage
cuando la aplicación se abre desde un estado en segundo plano.
Para garantizar que tus usuarios tengan una experiencia fluida, debes controlar ambas situaciones. En el siguiente ejemplo de código, se describe cómo hacerlo:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
La forma en que controlas las interacciones depende de tu configuración. El ejemplo que se mostró anteriormente es un ejemplo básico del uso de un StatefulWidget
.
Próximos pasos
Una vez que hayas completado los pasos de configuración, aquí se mencionan algunas opciones para seguir adelante con FCM para Flutter: