Search code examples
xamarin.formspush-notificationtap

Xamarin Forms: Load a contentpage when tap push notification android


I completed receiving test notification from FCM console. Now I am trying to open a page when tapping the notification. Any ideas about how to achieve this? I have searched the internet but can't find a working solution. I am also able to send the notification through the postman.


Solution

  • I handle the notification tapping in following way. The page loading is handled in App.xaml.cs.

    On OnCreate():

    //Background or killed mode
    if (Intent.Extras != null)
    {
        foreach (var key in Intent.Extras.KeySet())
        {
            var value = Intent.Extras.GetString(key);
            if (key == "webContentList") 
            {
                if (value?.Length > 0)
                {
                    isNotification = true;
                    LoadApplication(new App(domainname, value));
                }
            }
        }
    }
    //Foreground mode
    if (FirebaseNotificationService.webContentList.ToString() != "")
    {
        isNotification = true;
        LoadApplication(new App(domainname, FirebaseNotificationService.webContentList.ToString()));
        FirebaseNotificationService.webContentList = "";
    }
    
    //Normal loading
    if (!isNotification)
    {
        LoadApplication(new App(domainname, string.Empty));
    }
    

    On FirebaseNotificationService:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class FirebaseNotificationService : FirebaseMessagingService
    {
        public static string webContentList = "";
        public override void OnMessageReceived(RemoteMessage message)
        {
            base.OnMessageReceived(message);
            webContentList = message.Data["webContentList"];
    
            try
            {
                SendNotificatios(message.GetNotification().Body, message.GetNotification().Title);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error:>>" + ex);
            }
        }
    
        public void SendNotificatios(string body, string Header)
        {
            if (Build.VERSION.SdkInt < BuildVersionCodes.O)
            {
                var intent = new Intent(this, typeof(MainActivity));
                intent.AddFlags(ActivityFlags.ClearTop);
                var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
    
                var notificationBuilder = new Android.App.Notification.Builder(this, Utils.CHANNEL_ID)
                            .SetContentTitle(Header)
                            .SetSmallIcon(Resource.Drawable.icon)
                            .SetContentText(body)
                            .SetAutoCancel(true)
                            .SetContentIntent(pendingIntent);
    
                var notificationManager = NotificationManager.FromContext(this);
    
                notificationManager.Notify(0, notificationBuilder.Build());
            }
            else
            {
                var intent = new Intent(this, typeof(MainActivity));
                intent.AddFlags(ActivityFlags.ClearTop);
                var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
    
                var notificationBuilder = new Android.App.Notification.Builder(this, Utils.CHANNEL_ID)
                            .SetContentTitle(Header)
                            .SetSmallIcon(Resource.Drawable.icon)
                            .SetContentText(body)
                            .SetAutoCancel(true)
                            .SetContentIntent(pendingIntent)
                            .SetChannelId(Utils.CHANNEL_ID);
    
                if (Build.VERSION.SdkInt < BuildVersionCodes.O)
                {
                    return;
                }
    
                var channel = new NotificationChannel(Utils.CHANNEL_ID, "FCM Notifications", NotificationImportance.High)
                {
                    Description = "Firebase Cloud Messages appear in this channel"
                };
    
                var notificationManager = (NotificationManager)GetSystemService(NotificationService);
                notificationManager.CreateNotificationChannel(channel);
    
                notificationManager.Notify(0, notificationBuilder.Build());
            }
        }