Skip to content
Client v5: BLE, BLE Hosting, HTTP, Jobs - Linux, MacOS, & Blazor Support! Full AOT, RX on BLE only & MANY other features! Power up!

Local Notifications Releases

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.
Fix Android
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.
Fix Android
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.
Fix Android
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.
Fix Android
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.
Fix Android
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
Fix Android
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.
Fix Windows
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.
Fix Android
Request SCHEDULE_EXACT_ALARM properly via AlarmManager and system settings intent instead of treating it as a runtime permission
Fix Android
AndroidX version pins
Fix Android
Use notification audio channel
Fix ios
Crash tapping local notification on iOS earlier than 16 when accessing FilterCriteria
Enhancement Android
Using AndroidNotification, you can now set the android specific Category
Fix Android
Listen to activity.OnCreate intents
Enhancement Android
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