Skip to content

Core Releases

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
BREAKING Chore
Target frameworks now enforce net10 across the board
Fix
Allow for keyed services
Fix
ObservableList index out of range
BREAKING Enhancement
This module is now deprecated since Community Toolkit also has an offering in this space
BREAKING Enhancement
AppCenter has officially announced they are shutting down in 2025, so this library has been removed
Enhancement Android
Use ServiceCompat to start and stop android foreground service
Enhancement
Support for scopes
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
Enhancement Android
No longer emits notification for “foreground” service on older Android versions
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
Fix
Race condition when subscribed to ShinySubject based subjects (HTTP Transfers)
  • 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
Enhancement Android
To configure the foreground service notification on beacon monitoring, your IBeaconMonitorDelegate can also implement IAndroidForegroundServiceDelegate with ANDROID preprocessor directives
  • Shiny.NFC
  • Shiny.Sensors
  1. Install Shiny.Hosting.Maui
  2. Install the nuget package(s) shown above each comment below to get that functionality
  3. 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 delegate
public 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
}