Releases: thudugala/Plugin.LocalNotification
v14.1.0
✨ New Features
- Inline Reply Actions on Android, iOS, and macOS (text input support).
- Advanced Android Notification Styles: InboxStyle, MessagingStyle, MediaStyle.
- Foreground service support with start/stop APIs.
- Monthly repeat scheduling + improved alarm handling via
AndroidScheduleMode. - Full
DateTimeOffsetmigration for accurate cross‑timezone scheduling.
📱 Android Improvements
- Added
Person,Message, and extensible style models. - Added LED timing + audio attribute options (API < 26).
- Added notification
Tagsupport. - New
IAndroidNotificationServicefor permissions, channels, and cancellation.
🍎 iOS/macOS Improvements
- Text‑input notification actions.
- New Apple options:
CriticalSoundVolume,HideThumbnail,ThumbnailClippingRect. - Corrected
AppleCategoryOptionsflag names.
🧹 Refactoring & Cleanup
- Removed old
AndroidMediaStyle(replaced by new style system). - Refactored scheduling into
ScheduleAlarm. - General API cleanup and formatting improvements.
📦 Package Updates
Plugin.LocalNotification→ 14.1.0Plugin.LocalNotification.Core→ 1.1.0Plugin.LocalNotification.Geofence→ 1.1.0
Full Changelog: v14.0.0...v14.1.0
v14.0.0
Overview
Plugin.LocalNotification v14.0.0 is a major release featuring significant architectural improvements, platform expansion, and enhanced geofence support. This version modernises the codebase while maintaining backward compatibility for core functionality.
🎯 Major Changes
Architecture Restructuring
-
New Core Package: Introduced
Plugin.LocalNotification.Corecontaining shared models, interfaces, and platform utilities- Separates core notification models from platform-specific implementations
- Improves code reusability and maintainability
-
New Geofence Package:
Plugin.LocalNotification.Geofenceas an optional add-on- Enables geofence notifications on Android, iOS, and macOS
- Reduces core dependencies by moving geofence logic to a separate package
- Register with
.UseLocalNotificationGeofence()in MauiAppBuilder
Platform Support Expansion
- Added: macCatalyst platform support
- Updated to .NET 10.0 (from .NET 9.0)
Naming Convention Updates
- iOS → Apple: Renamed all iOS-specific types for clarity (e.g.,
iOSOptions→AppleOptions,iOSActionType→AppleActionType) - All iOS namespace paths updated from
iOSOptiontoAppleOption - Applied consistently across models and platform code
Logging Improvements
- New:
LocalNotificationLoggerstatic class replaces scattered logging logic- Centralised logging with configurable
LogLevel - Supports custom
ILoggerinstances - Automatic caller name tracking via
[CallerMemberName]
- Centralised logging with configurable
Package Restructuring
- Solution format modernised from
.slnto.slnxformat - Three separate NuGet packages available:
Plugin.LocalNotification.Core- Core models and interfacesPlugin.LocalNotification- Main notification servicePlugin.LocalNotification.Geofence- Geofence support (optional)
🔧 Breaking Changes
Namespace Changes
// Old
using Plugin.LocalNotification.iOSOption;
using Plugin.LocalNotification.AndroidOption;
// New
using Plugin.LocalNotification.Core.Models.AppleOption;
using Plugin.LocalNotification.Core.Models.AndroidOption;Type Renames
iOSOptions→AppleOptionsiOSAction→AppleActioniOSActionType→AppleActionTypeiOSActionIcon→AppleActionIconiOSAuthorizationOptions→AppleAuthorizationOptionsiOSLocationAuthorization→AppleLocationAuthorizationNotificationChannelRequest→AndroidNotificationChannelRequestNotificationChannelGroupRequest→AndroidNotificationChannelGroupRequestiOSNotificationPermission→AppleNotificationPermissioniOSGeofenceOptions→AppleGeofenceOptions
API Changes
LocalNotificationCenter.LogLevel→LocalNotificationLogger.LogLevelLocalNotificationCenter.Log()→LocalNotificationLogger.Log()- Request objects (iOS): Use
.Appleproperty instead of.iOS - Android: Use
AndroidNotificationChannelRequestinstead ofNotificationChannelRequest
Removed
- Windows platform code removed (replaced with WinUI implementation)
- MacCatalyst-specific files removed (now under iOS umbrella)
- Generic notification service
NotificationServiceImplmoved to core
✨ New Features
Geofence Support Enhancement
- Dedicated geofence handler registry for modular architecture
- Support for location-based notifications on iOS and Android
- Android: Uses Google Play Services Location for geofencing
- Geofence data serialisation with
NotificationRequestGeofence
Windows Support
- Full UWP/WinUI notification support via
AppNotificationManager - File-based repository for pending/delivered notifications
- Timer-based scheduling for delayed notifications
- Image and action button support
macOS (macCatalyst) Support
- Native UserNotifications framework integration
- Calendar-based notification triggers
- Geofence location-based triggers
- Privacy info manifest support
Multi-Solution Support
- Traditional
.slnfiles for Visual Studio compatibility - Modern
.slnxformat for enhanced IDE support - Updated CI/CD workflows to support the new structure
📦 Dependencies
- Updated to .NET 10 SDK
- Microsoft.SourceLink.GitHub: 8.0.0 → 10.0.103
- Microsoft.Extensions.Logging: Updated references
- New: Xamarin.GooglePlayServices.Location (Android, when a geofence is used)
- New: Microsoft.WindowsAppSDK 1.8.260209005 (Windows)
🔄 Sample Application Updates
- Updated target frameworks to .NET 10
- Migrated to new namespace structure
- Added geofence usage examples (commented out)
- Replaced legacy XAML layouts (StackLayout → Grid)
- Added location permissions in Android manifest
- Added XAML compilation optimisation settings
📋 CI/CD Updates
- Xcode version updated to 26.2
- Build pipeline now compiles three packages:
- Plugin.LocalNotification.Core
- Plugin.LocalNotification
- Plugin.LocalNotification.Geofence
- Separate artefact uploads for each package
🎓 Migration Guide
For Existing Users
- Update NuGet packages to v14.0.0
- Replace namespace imports with new structure
- Update property names:
.iOS→.Apple - Update type names (see Breaking Changes section)
- For geofence features, add
Plugin.LocalNotification.Geofencepackage and call.UseLocalNotificationGeofence()
Example
// Old way (v13)
using Plugin.LocalNotification.iOSOption;
var request = new NotificationRequest { iOS = new iOSOptions() };
// New way (v14)
using Plugin.LocalNotification.Core.Models.AppleOption;
var request = new NotificationRequest { Apple = new AppleOptions() };
// Enable geofencing
MauiAppBuilder
.UseLocalNotification()
.UseLocalNotificationGeofence();📊 Platform Support Matrix
| Feature | Android | iOS | macOS | Windows |
|---|---|---|---|---|
| Local Notifications | ✅ | ✅ | ✅ | ✅ |
| Geofence | ✅ | ✅ | ❌ | ❌ |
| Actions/Buttons | ✅ | ✅ | ✅ | ❌ |
| Custom Images | ✅ | ✅ | ✅ | ❌ |
| Scheduling | ✅ | ✅ | ✅ | ❌ |
| Repeating | ✅ | ✅ | ✅ | ❌ |
🐛 Quality Improvements
- Enhanced test coverage with new unit tests
- Comprehensive coverage tests for core models
- Better separation of concerns between packages
- Improved XML documentation across all types
🔐 Modernizations
- C# 12+ features utilised where applicable
- Target framework modernisation to .NET 10
- Updated GitHub Actions workflows
- Added GitHub Sponsors funding configuration
Full Changelog: v13.0.0...v14.0.0
v13.0.0
What's Changed
- Bug Fix (#538): Resolved an issue where
Geofence.Center.Latitudecould be set to"NaN", causing deserialization errors when converting toNotificationRequest. - Platform Update:
- Dropped support for .NET 8, as it has reached end of support. See the official .NET MAUI support policy for details.
- Added support for .NET 10, ensuring compatibility with the latest runtime and tooling.
Full Changelog: V12.0.2...v13.0.0
V12.0.2
Full Changelog: v12.0.1...V12.0.2
Add missing XML comments.
Set IsAotCompatible to true, and make sure to use NotificationJsonContext inside NotificationSerializer.
When using net8.0-android
Add the package references below for Android
<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
<PackageReference Include="Xamarin.AndroidX.Fragment.Ktx" Version="1.8.6.2" />
</ItemGroup>V12.0.1
v12.0.0
v11.1.4
#507 Updated GooglePlayServices nuget
Thank you @Kebechet
Make sure to Add these Package Reference for android
<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
<PackageReference Include="Xamarin.AndroidX.Fragment.Ktx" Version="1.8.1" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Common" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.LiveData.Core" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Process" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Runtime" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.Runtime.Ktx" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.ViewModel" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.ViewModel.Ktx" Version="2.8.3" />
<PackageReference Include="Xamarin.AndroidX.Lifecycle.ViewModelSavedState" Version="2.8.3" />
</ItemGroup>v11.1.3
v11.1.2
- #490 Android: If the sound file is not stored as an Android resource correctly in the raw folder, an exception is triggered.
- Added support request Schedule Exact Alarm
var permissionRequest = new NotificationPermission
{
Android =
{
RequestPermissionToScheduleExactAlarm = true
}
};
if (await _notificationService.AreNotificationsEnabled(permissionRequest) == false)
{
await _notificationService.RequestNotificationPermission(permissionRequest);
}