Core Releases
4.1.0 - TBD
Section titled “4.1.0 - TBD” Enhancement
Thread-safe BindingList replaces ObservableList across the framework
Enhancement
AOT-compatible store extensions - removed Expression.Lambda compilation
Enhancement
IRepository.GetList now accepts Func predicate instead of Expression for better AOT support
4.0.0 - March 26, 2026
Section titled “4.0.0 - March 26, 2026” BREAKING Chore
Target frameworks now enforce net10 across the board
3.3.0 - March 18, 2024
Section titled “3.3.0 - March 18, 2024” Fix
ObservableList index out of range
Speech Recognition
Section titled “Speech Recognition” BREAKING Enhancement
This module is now deprecated since Community Toolkit also has an offering in this space
AppCenter Logging
Section titled “AppCenter Logging” BREAKING Enhancement
AppCenter has officially announced they are shutting down in 2025, so this library has been removed
3.2.1 - December 19, 2023
Section titled “3.2.1 - December 19, 2023” Enhancement Android
Use ServiceCompat to start and stop android foreground service
AppCenter Logging
Section titled “AppCenter Logging” Enhancement
Support for scopes
3.2.0 - December 8, 2023
Section titled “3.2.0 - December 8, 2023” BREAKING Enhancement
Moving from .NET 7 to .NET 8
BREAKING Enhancement
Target moved from monoandroid 12 to monoandroid 13 classic
Enhancement
BLE, BLE Hosting, GPS, & Geofencing managers now allow you to check current permissions without requesting
3.1.2 - November 7, 2023
Section titled “3.1.2 - November 7, 2023” Enhancement Android
No longer emits notification for “foreground” service on older Android versions
3.1.0 - October 26, 2023
Section titled “3.1.0 - October 26, 2023” Enhancement Android
Android OnCreate events are now hookable through standard lifecycle interfaces
Fix
Connectivity.WhenInternetStatusChanged will now prevent repeated firing if the value hasn’t changed
3.0.1 - September 19, 2023
Section titled “3.0.1 - September 19, 2023” Fix
Race condition when subscribed to ShinySubject based subjects (HTTP Transfers)
3.0.0 - September 5, 2023
Section titled “3.0.0 - September 5, 2023”- Shiny.Hosting.Maui initial integration package created (Example how to setup shown below)
BREAKING
Don’t use the Shiny package any longer. It contains all of the source generator stuff that is no longer needed as part of v3.
BREAKING
IShinyStartup is gone - we now have a new HostBuilder pattern to allow classic to align with MAUI/NET6. Use extensions methods to build on this for classic/non-MAUI setups
BREAKING
IShinyModule is gone - use extensions methods instead
Enhancement
IShinyStartupTask and INotifyPropertyChanged persistent services are now registered using the service collection extension .AddShinyService during your bootstrapping
Enhancement
New hosting model that is meant to carry Shiny forward to other platforms and improve on the original ShinyHost model. It also allows us to move to other platforms outside of MAUI
Enhancement
New internal lifecycle processor
Enhancement
Any Shiny library that uses an Android foreground service (Beacon Monitoring, GPS, HTTP Transfers) now has a new mechanism that allows for FULL control over the persistent notification
Enhancement
Repositories and other “fatty” code has been moved out of Shiny.Core where possible
Beacons
Section titled “Beacons” Enhancement Android
To configure the foreground service notification on beacon monitoring, your IBeaconMonitorDelegate can also implement IAndroidForegroundServiceDelegate with ANDROID preprocessor directives
Libraries that will not move to v3
Section titled “Libraries that will not move to v3”- Shiny.NFC
- Shiny.Sensors
MAUI Setup
Section titled “MAUI Setup”- Install Shiny.Hosting.Maui
- Install the nuget package(s) shown above each comment below to get that functionality
- Ensure you add UseShiny as shown below
using Shiny;
namespace Sample;
public static class MauiProgram{ public static MauiApp CreateMauiApp() { var builder = MauiApp .CreateBuilder() .UseMauiApp<App>() // THIS IS REQUIRED TO BE DONE FOR SHINY TO RUN .UseShiny();
// shiny.locations builder.Services.AddGps<SampleGpsDelegate>(); builder.Services.AddGeofencing<SampleGeofenceDelegate>(); builder.Services.AddMotionActivity();
// shiny.notifications builder.Services.AddNotifications<SampleNotificationDelegate>();
// shiny.bluetoothle builder.Services.AddBluetoothLE<SampleBleDelegate>();
// shiny.bluetoothle.hosting builder.Services.AddBluetoothLeHosting();
// shiny.beacons builder.Services.AddBeaconRanging(); builder.Services.AddBeaconMonitoring<SampleBeaconMonitorDelegate>();
// shiny.net.http builder.Services.AddHttpTransfers<SampleHttpTransferDelegate>();
// shiny.speechrecognition builder.Services.AddSpeechRecognition();
// shiny.push builder.Services.AddPush<SamplePushDelegate>();
// shiny.jobs builder.Services.AddJob(typeof(SampleJob)); builder.Services.AddJobs(); // not required if using above
// shiny.core - startup task & persistent service registration builder.Services.AddShinyService<StartupTask>();
// shiny.push builder.Services.AddPush<SamplePushDelegate>();
// or shiny.push.firebasemessaging builder.Services.AddPushFirebaseMessaging<SamplePushDelegate>();
// or shiny.push.azurenotificationhubs builder.Services.AddPushAzureNotificationHubs<SamplePushDelegate>();
return builder.Build(); }}New Android Foreground Service Notification Customization
Section titled “New Android Foreground Service Notification Customization”// ex. this is using a GPS background delegatepublic class MyGpsDelegate : Shiny.Locations.IGpsDelegate#if ANDROID , Shiny.IAndroidForegroundServiceDelegate#endif{ // .. implementation details left out for brevity
#if ANDROID public void Configure(Android.NotificationCompat.Builder builder) { var builder = new NotificationCompat.Builder(this.Context, "gps"); builder.SetContentTitle("GPS"); builder.SetContentText("GPS is running in the background"); builder.SetSmallIcon(Resource.Drawable.ic_launcher_foreground); builder.SetPriority((int)NotificationCompat.PriorityHigh); builder.SetCategory(NotificationCompat.CategoryService); }#endif}