Skip to content
Document DB v12 - Improved Interceptors with Soft Delete Integration, AI protections, & Admin UI with Aspire Integration!How!?

Local Notifications Releases

BREAKINGEnhancement
Shiny.Notifications.Extensions.AI registration moved to the Shiny namespace. AddNotificationAITools() now lives on Shiny.NotificationAiServiceCollectionExtensions instead of Shiny.Notifications.Extensions.AI.ServiceCollectionExtensions, so the using Shiny.Notifications.Extensions.AI; in your MauiProgram is no longer needed — Shiny is a global using from Shiny.Core. The builder/capability types (ReminderAICapabilities, NotificationAITools) stay where they are; only the registration entry point moved.
Feature
Shiny.Notifications.Extensions.AI — new package exposing local notifications as reminder-framed Microsoft.Extensions.AI tool functions for LLM agents. Opt-in read/write allow-list via AddNotificationAITools(b => b.AddReminders(ReminderAICapabilities.ReadWrite)); generates list_reminders, create_reminder (one-time or daily), and cancel_reminder. AOT-compatible. See AI Tools.
FixAndroid
Scheduled notifications no longer silently fail to fire when exact alarm permission is not granted. On Android 12+ Shiny now falls back to an inexact alarm (which may be slightly delayed by the OS) instead of throwing a SecurityException when SCHEDULE_EXACT_ALARM/USE_EXACT_ALARM access is unavailable. Request AccessRequestFlags.TimeSensitivity for exact, on-time delivery.
FixAndroid
Corrected the exact-alarm manifest guidance. Capping SCHEDULE_EXACT_ALARM with android:maxSdkVersion="32" without also declaring USE_EXACT_ALARM leaves an app with no exact-alarm permission on Android 13+ (API 33+) - the “Alarms & reminders” toggle appears greyed out and unchecked. Most apps should now declare SCHEDULE_EXACT_ALARM uncapped; only genuine alarm/reminder apps use the capped + USE_EXACT_ALARM pairing.
FixAndroid
Scheduled, repeating, and geofence notifications now appear in GetPendingNotifications() (and can be cancelled by id). They were being persisted under the wrong entity type, so the pending list always came back empty and Cancel(id)/GetNotification(id) could not find them. Repeating notifications now also persist their recalculated next-fire date after each alarm fires, so they stay in the pending list across occurrences instead of disappearing.
FixAndroid
Fixed multiple scheduled/repeating notifications colliding on a single alarm. The alarm PendingIntent now uses the notification id as its request code - previously a shared request code meant a newly scheduled notification overwrote earlier pending alarms, Cancel could cancel the wrong alarm, and a fired alarm could resolve the wrong notification.
FixAndroid
Fixed IGeofenceManager is not registered exception when using Shiny.Notifications as a standalone package (without Shiny.Locations) - AddNotifications() now registers the geofence services and NotificationGeofenceDelegate needed for geofence-triggered local notifications
FixAndroid
Fixed No JsonTypeInfo registered for type 'Shiny.Notifications.Notification' thrown from Send - the base Notification/Channel types are now registered in the source-generated JSON context (the Android notification intent serializes the base Notification). List and array variants of all notification types are registered as well.
FixWindows
Unpackaged apps no longer throw/log an error from RequestAccess/GetCurrentAccess - ToastNotifier.Setting is unsupported without package identity, so access is now reported as available instead of failing
Feature
macOS support added - local notifications via UNUserNotificationCenter
Feature
Windows support added - local notifications via ToastNotificationManager (channels are limited compared to mobile)
Feature
Linux support added via new Shiny.Notifications.Linux package. Delivered through the freedesktop org.freedesktop.Notifications D-Bus service (GNOME, KDE, etc.). Scheduled notifications are tracked in-process only — the host must be running for them to fire, since there is no OS-level scheduler on Linux.
FixAndroid
Request SCHEDULE_EXACT_ALARM properly via AlarmManager and system settings intent instead of treating it as a runtime permission
FixAndroid
AndroidX version pins
FixAndroid
Use notification audio channel
Fixios
Crash tapping local notification on iOS earlier than 16 when accessing FilterCriteria
EnhancementAndroid
Using AndroidNotification, you can now set the android specific Category
FixAndroid
Listen to activity.OnCreate intents
EnhancementAndroid
Android 13 Support for new POST_NOTIFICATION permissions
Enhancement
OS specific configuration for Android and iOS
Enhancement
Ability to customize actual native notification before it is sent/queued
Enhancement
Improved sound customization via new channel flag - Channel.Sound = ChannelSound.Custom|High|Default|None