From maui-skills
Implements local notifications in .NET MAUI apps for Android, iOS, Mac Catalyst. Covers channels, permissions, scheduling, foreground/background handling, DI registration, and platform gotchas.
How this skill is triggered — by the user, by Claude, or both
Slash command
/maui-skills:maui-local-notificationsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
1. Define cross-platform `INotificationManagerService` interface and event args
INotificationManagerService interface and event argsSee references/local-notifications-api.md for full implementation code.
| Issue | Fix |
|---|---|
| Notifications silently fail on API 33+ | Must request POST_NOTIFICATIONS runtime permission first |
PendingIntent crash on Android 12+ | Must include PendingIntentFlags.Immutable for API 31+ |
| Scheduled notifications lost on reboot | AlarmManager does not survive device restart — re-schedule on boot via BOOT_COMPLETED receiver |
| No notification appears | Channel not created — required on API 26+ (Android 8.0) |
| Notification tap doesn't return to app | LaunchMode = LaunchMode.SingleTop must be set on MainActivity |
// ✅ Correct — API 31+ requires Immutable flag
var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S)
? PendingIntentFlags.CancelCurrent | PendingIntentFlags.Immutable
: PendingIntentFlags.CancelCurrent;
// ❌ Wrong — crashes on Android 12+
var pendingIntentFlags = PendingIntentFlags.CancelCurrent;
| Issue | Fix |
|---|---|
| No notification prompt appears | Permission already denied — user must re-enable in Settings |
| Foreground notifications don't show | Must implement UNUserNotificationCenterDelegate and set Current.Delegate |
Notification shows Alert not Banner | Use UNNotificationPresentationOptions.Banner on iOS 14+ |
// ✅ iOS 14+ — use Banner
completionHandler(OperatingSystem.IsIOSVersionAtLeast(14)
? UNNotificationPresentationOptions.Banner
: UNNotificationPresentationOptions.Alert);
// ❌ Always using Alert — deprecated on iOS 14+
completionHandler(UNNotificationPresentationOptions.Alert);
⚠️ Windows App SDK supports toast notifications but scheduled notifications are not yet supported. Immediate notifications work.
// ✅ Must use #if guards — there's no cross-platform implementation
#if ANDROID
builder.Services.AddTransient<INotificationManagerService,
Platforms.Android.NotificationManagerService>();
#elif IOS
builder.Services.AddTransient<INotificationManagerService,
Platforms.iOS.NotificationManagerService>();
#elif MACCATALYST
builder.Services.AddTransient<INotificationManagerService,
Platforms.MacCatalyst.NotificationManagerService>();
#endif
// ❌ Sending without checking permission — silent failure on API 33+
notificationManager.SendNotification("Title", "Body");
// ✅ Request permission first
#if ANDROID
var status = await Permissions.RequestAsync<Platforms.Android.NotificationPermission>();
if (status != PermissionStatus.Granted) return;
#endif
// ❌ Updating UI directly from notification callback — cross-thread exception
notificationManager.NotificationReceived += (s, e) =>
myLabel.Text = ((NotificationEventArgs)e).Title;
// ✅ Marshal to UI thread
notificationManager.NotificationReceived += (s, e) =>
MainThread.BeginInvokeOnMainThread(() =>
myLabel.Text = ((NotificationEventArgs)e).Title);
| Need | Approach |
|---|---|
| Immediate notification | SendNotification(title, message) with null notifyTime |
| Scheduled reminder | SendNotification(title, message, DateTime.Now.AddMinutes(30)) |
| Persist across reboot (Android) | Add BOOT_COMPLETED receiver to re-schedule alarms |
| Rich notifications (images, actions) | Extend platform implementations with native APIs |
| Push notifications from server | Use a different pattern entirely (FCM/APNs) |
INotificationManagerService interface definedPOST_NOTIFICATIONS permission in manifest + runtime request (API 33+)PendingIntentFlags.Immutable used (API 31+)MainActivity has LaunchMode.SingleTop and handles OnNewIntentUNUserNotificationCenterDelegate set for foreground displayBanner used instead of Alert on iOS 14+#if platform guardsMainThread.BeginInvokeOnMainThreadnpx claudepluginhub davidortinau/maui-skills --plugin maui-skillsGuides adding push notifications to .NET MAUI apps via FCM (Android), APNS (iOS), Azure Notification Hubs broker, and ASP.NET Core backend API. Covers registration, tokens, permissions, and gotchas.
Implements and debugs push notifications in iOS/macOS apps — local, remote (APNs), rich notifications, actions, silent pushes, and extensions.
Building .NET MAUI apps. Project structure, XAML/MVVM, platform services, current caveats.