firebase xamarin xamarin.android firebase-cloud-messaging

Cómo manejar la notificación de Firebase, es decir, mensajes de notificación y mensajes de datos en Android



xamarin xamarin.android (1)

¿Cuál es la mejor manera de manejar tanto los mensajes de notificación como los mensajes de datos en firebase usando Xamarin Android, mientras el usuario está en primer plano y en segundo plano?

Además, ¿cómo obtengo los datos de notificación, por ejemplo, el texto de una notificación en particular?

PD: He visitado los siguientes hilos y ninguno realmente ayudó:

Cuando la pantalla del dispositivo está apagada, ¿cómo manejar la notificación de Firebase?

Notificación y datos de Firebase

Mostrar mensaje de datos de notificación de Firebase en la bandeja de Android


Bueno, encontré las respuestas a mi propia pregunta, así que estoy publicando la respuesta para alguien que está buscando la integración de Firebase en xamarin.

  • Instale el paquete Xamarin.Firebase.Messaging en su proyecto.

  • Agregue el siguiente código a su manifest.xml para recibir notificaciones de Firebase.

    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" /> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="${applicationId}" /> </intent-filter> </receiver>

  • Ahora, para obtener el token de registro de Firebase, agregue un archivo de clase y agregue el siguiente código:

    [Service] [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })] public class MyFirebaseIIDService : FirebaseInstanceIdService { public override void OnTokenRefresh() { const string TAG = "MyFirebaseIIDService"; var refreshedToken = FirebaseInstanceId.Instance.Token; Log.Debug(TAG, "Refreshed token: " + refreshedToken); SendRegistrationToServer(refreshedToken); } void SendRegistrationToServer(string token) { // Add custom implementation, as needed. } }

    Aquí FirebaseInstanceId.Instance.Token obtiene el token de instancia para el dispositivo actual, también se puede usar el método SendRegistrationToServer para enviar el token para enviar el token a un servidor.

  • Ahora agregue otra clase para manejar las notificaciones en primer plano

    [Service] [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] public class MyFirebaseMessagingService : FirebaseMessagingService { // private string TAG = "MyFirebaseMsgService"; public override void OnMessageReceived(RemoteMessage message) { base.OnMessageReceived(message); string messageFrom = message.From; string getMessageBody = message.GetNotification().Body; SendNotification(message.GetNotification().Body); } void SendNotification(string messageBody) { try { var intent = new Intent(this, typeof(MainActivity)); intent.AddFlags(ActivityFlags.ClearTop); var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification) .SetContentTitle("Title") .SetContentText(messageBody) .SetAutoCancel(true) .SetContentIntent(pendingIntent); NotificationManagerCompat notificationManager = NotificationManagerCompat.From(this); notificationManager.Notify(0, notificationBuilder.Build()); } catch (Exception ex) { } } }

Aquí, el método SendNotification se usa para enviar explícitamente una notificación a la bandeja del sistema, ya que las notificaciones push mientras el dispositivo está en primer plano no se muestran automáticamente en la bandeja del sistema.

  • Cuando el dispositivo está en segundo plano o la notificación de apagado se genera automáticamente y, de forma predeterminada, se carga la actividad del iniciador principal, para obtener los datos de la notificación en segundo plano, debe usar la intención de la siguiente manera (en su actividad del iniciador principal):

    if (Intent.Extras != null) { foreach (var key in Intent.Extras.KeySet()) { var value = Intent.Extras.GetString(key); Log.Debug(TAG, "Key: {0} Value: {1}", key, value); } }

  • Además, si los servicios de Google Play no están actualizados, este código podría bloquear su aplicación, por lo que debe verificar si los servicios de Google Play están disponibles o no:

    public bool IsPlayServicesAvailable() { int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.Success) { if (GoogleApiAvailability.Instance.IsUserResolvableError(resultCode)) msgText.Text = GoogleApiAvailability.Instance.GetErrorString(resultCode); else { msgText.Text = "This device is not supported"; Finish(); } return false; } else { msgText.Text = "Google Play Services is available."; return true; } }

Consulte el siguiente enlace para obtener información sobre cómo agregar su proyecto a la consola de Firebase:

https://developer.xamarin.com/guides/android/data-and-cloud-services/google-messaging/remote-notifications-with-fcm/ /

Actualizar

  • Después de los cambios recientes en el Android Oreo, es obligatorio que agregue sus notificaciones en un canal para el que necesita crear un canal de notificación en su actividad principal como se muestra a continuación:

    void CreateNotificationChannel() { if (Build.VERSION.SdkInt < BuildVersionCodes.O) { // Notification channels are new in API 26 (and not a part of the // support library). There is no need to create a notification // channel on older versions of Android. return; } var channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default) { Description = "Firebase Cloud Messages appear in this channel" }; var notificationManager = (NotificationManager) GetSystemService(NotificationService); notificationManager.CreateNotificationChannel(channel); }

Llame a este método en su método OnCreate de MainActivity.