.NET MAUI Push Notifications Step by step Implementation and Top 10 Questions and Answers
 Last Update: April 01, 2025      12 mins read      Difficulty-Level: beginner

Understanding .NET MAUI Push Notifications: A Comprehensive Guide

Push notifications are a powerful tool for engaging users and keeping them informed about new content, updates, or relevant information in your application. With .NET Multi-platform App UI (.NET MAUI), you can create cross-platform mobile applications that deliver rich and interactive push notifications. This guide will walk you through the process of implementing push notifications in .NET MAUI, covering everything from setting up your development environment to handling notifications within your app.

Prerequisites:

  • Basic knowledge of C# and .NET MAUI.
  • Familiarity with creating projects in Visual Studio 2022 or later.
  • An active Google Developer account for Android, and an Apple Developer account for iOS.
  • Xcode installed for iOS development (Mac required).

1. Setting Up Your Project

1.1 Create a .NET MAUI Project

Open Visual Studio and create a new .NET MAUI project by selecting File > New > Project, searching for .NET MAUI App, and following the setup instructions.

1.2 Setup Platform-Specific Projects

You'll need to configure push notifications for both Android and iOS separately. Ensure you've set up the necessary configurations for each platform:

  • Android: Set up Firebase Cloud Messaging (FCM) and configure your AndroidManifest.xml.
  • iOS: Enable push notifications in your Info.plist and set up an Apple Push Notification service (APNs) certificate.

2. Configuring Firebase for Android

2.1 Create a Firebase Project

  • Go to the Firebase Console.
  • Click on Add project and follow the prompts to create a new project.

2.2 Add Your Android App to Firebase

  • In the Firebase Console, click Add app and select Android.
  • Register your app with the package name you used in your .NET MAUI project.
  • Download the google-services.json file and place it in the Platforms/Android folder of your .NET MAUI project.

2.3 Update Android Manifest

Add the necessary permissions and services in your AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application>
    <!-- Firebase Messaging Service -->
    <service
        android:name=".FirebaseService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    <!-- Handle boot events to restart the app if it's closed -->
    <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>
</application>

3. Configuring APNs for iOS

3.1 Create an Apple Developer Account

You must have an Apple Developer account to proceed. If you don't, you can sign up at the Apple Developer website.

3.2 Configure APNs in Your App ID

  • Log in to the Apple Developer Console.
  • Navigate to Certificates, Identifiers & Profiles > Identifiers, and select your app ID.
  • Enable Push Notifications under the Capabilities tab.

3.3 Download a Certificate or Key

Create a new APNs key or certificate:

  • Go to Keys under Certificates, Identifiers & Profiles.
  • Click the + button to create a new key and enable APNs.
  • Download the .p8 key file or a .p12 certificate.

3.4 Update Your iOS Project Configuration

In Visual Studio, navigate to your iOS project settings and enable push notifications:

  • Right-click on iOS in the Solution Explorer > Properties.
  • Go to the Signing & Capabilities tab.
  • Click the + Capability button and add Push Notifications.

Copy your Team ID and Key ID from the Apple Developer Console, as you'll need them to configure your backend service.

4. Implementing Push Notifications in .NET MAUI

4.1 Install Required NuGet Packages

Add the necessary NuGet packages for handling push notifications in your .NET MAUI project:

  • Xamarin.Firebase.Messaging
  • Xamarin.Firebase.Core
  • Xamarin.Firebase.iOS.CloudMessaging (iOS only)

You can install these packages via the NuGet Package Manager in Visual Studio.

4.2 Handle Notifications in Android

Create a custom FirebaseMessagingService to handle incoming messages:

[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class FirebaseService : FirebaseMessagingService
{
    public override void OnMessageReceived(RemoteMessage message)
    {
        base.OnMessageReceived(message);
        // Handle FCM messages here.
        // For example, you can extract data or handle notifications as required.
        SendNotification(message.GetNotification().Body, message.GetNotification().Title);
    }

    private void SendNotification(string messageBody, string messageTitle = "")
    {
        var intent = new Intent(this, typeof(MainActivity));
        intent.AddFlags(ActivityFlags.ClearTop);
        var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

        var builder = new NotificationCompat.Builder(this, "default")
            .SetSmallIcon(Resource.Drawable.ic_launcher)
            .SetContentTitle(messageTitle)
            .SetContentText(messageBody)
            .SetPriority(NotificationCompat.PriorityDefault)
            .SetContentIntent(pendingIntent);

        var notificationManager = NotificationManager.FromContext(this);
        notificationManager.Notify(0, builder.Build());
    }
}

4.3 Handle Notifications in iOS

Override the DidReceiveRemoteNotification method in your AppDelegate to handle incoming push notifications:

[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

    public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    {
        // Handle incoming push notifications
        ProcessNotification(userInfo);
        completionHandler(UIBackgroundFetchResult.NewData);
    }

    private void ProcessNotification(NSDictionary userInfo)
    {
        if (userInfo.ContainsKey(new NSString("aps")))
        {
            var aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
            string alert = string.Empty;

            if (aps.ContainsKey(new NSString("alert")) && aps.ObjectForKey(new NSString("alert")) is NSDictionary alertDict)
            {
                alert = alertDict[new NSString("body")]?.ToString() ?? string.Empty;
            }
            else if (aps.ContainsKey(new NSString("alert")))
            {
                alert = aps[new NSString("alert")]?.ToString() ?? string.Empty;
            }

            // Display the notification to the user or handle it as required
            DisplayAlert("Notification", alert, "OK");
        }
    }

    private void DisplayAlert(string title, string message, string cancel)
    {
        var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert);
        alert.AddAction(UIAlertAction.Create(cancel, UIAlertActionStyle.Default, null));
        CurrentWindow.RootViewController.PresentViewController(alert, true, null);
    }
}

4.4 Request Notification Permissions

For iOS, you need to request explicit permission from the user to receive push notifications:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    base.FinishedLaunching(app, options);

    if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
    {
        // iOS 10 or later
        UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound,
            (approved, error) =>
            {
                CrossFirebasePushNotification.Current.OnRequestPermissionResult(approved, error);
            });
    }
    else if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
    {
        // iOS 8 or later
        var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
            new NSSet());

        app.RegisterUserNotificationSettings(settings);
    }

    app.RegisterForRemoteNotifications();

    return true;
}

5. Sending Push Notifications

To send push notifications, you need a backend service to handle communication with FCM or APNs. Here's an example of how to send a notification using C# and Firebase Admin SDK for FCM:

5.1 Install Firebase Admin SDK

Install the FirebaseAdmin NuGet package in your backend project:

dotnet add package FirebaseAdmin

5.2 Initialize Firebase Admin SDK

Initialize the SDK in your backend project:

using FirebaseAdmin;
using FirebaseAdmin.Messaging;

public class FirebaseService
{
    public FirebaseService()
    {
        FirebaseApp.Create(new AppOptions()
        {
            Credential = GoogleCredential.FromFile("path/to/serviceAccountKey.json"),
        });
    }

    public async Task SendNotificationAsync(string registrationToken, string title, string body)
    {
        var message = new Message()
        {
            Token = registrationToken,
            Notification = new Notification()
            {
                Title = title,
                Body = body,
            },
        };

        await FirebaseMessaging.DefaultInstance.SendAsync(message);
    }
}

5.3 Send Notifications to Users

You can now send push notifications to users by their registration tokens:

await firebaseService.SendNotificationAsync("user_registration_token_here", "Hello", "This is a push notification from your .NET MAUI app!");

6. Handling Registration Tokens

6.1 Get Registration Token in Android

Retrieve the registration token in your FirebaseService:

public override void OnNewToken(string token)
{
    base.OnNewToken(token);
    // Send the registration token to your backend server or store it locally
    SendRegistrationTokenToServer(token);
}

private void SendRegistrationTokenToServer(string token)
{
    // Implement logic to send the token to your server
}

6.2 Get Device Token in iOS

Retrieve the device token in your AppDelegate:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    // Send the device token to your backend server or store it locally
    SendDeviceTokenToServer(deviceToken);
}

public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
{
    // Handle errors here
}

private void SendDeviceTokenToServer(NSData deviceToken)
{
    // Implement logic to send the token to your server
}

7. Testing and Debugging

  • Ensure your development environment is correctly configured and that your app is registered with the appropriate push notification services.
  • Test push notifications on real devices, as simulators/emulators may not support all notification features.
  • Use the Firebase Console or APNs provider tools to send test messages and verify that push notifications are working as expected.

8. Best Practices

  • User Experience: Ensure push notifications are relevant and valuable to your users to maintain a good user experience.
  • Battery Performance: Use push notifications sparingly to avoid draining the user's battery.
  • Security: Securely handle and store user registration tokens and sensitive information related to push notifications.
  • Error Handling: Implement robust error handling to manage issues related to push notifications delivery.

9. Advanced Features

  • Rich Notifications: Use rich notifications to include images, media, and interactive elements.
  • Subscriptions: Allow users to subscribe to specific topics to receive targeted notifications.
  • Custom Actions: Implement custom actions that allow users to perform specific tasks directly from push notifications.

Conclusion

Implementing push notifications in a .NET MAUI application involves configuring both Android and iOS platforms, setting up your backend server, handling registration tokens, and sending notifications. With Firebase Cloud Messaging and Apple Push Notification service, you can deliver powerful and engaging push notifications to your users across multiple platforms. By following the steps outlined in this guide, you'll be well on your way to creating a seamless and effective notification system in your .NET MAUI application.

For further learning, refer to the official Google Firebase Documentation and Apple Push Notification Documentation to explore advanced features and best practices.