Skip to content
Shiny.NET
GitHubTwitter
Blog

Releases

3.0.1 - September 19, 2023

Core

Fix
Race condition when subscribed to ShinySubject based subjects (HTTP Transfers)

Push

Fix
IOS
Provider push token is now returned by PushManager.RequestAccess instead of native token

3.0.0 - September 5, 2023

MAUI

  • Shiny.Hosting.Maui initial integration package created (Example how to setup shown below)

Core

BREAKING
Enhancement
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
Enhancement
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
Enhancement
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

Configuration

  • Configuration is now part of the core library
    Enhancement
    Now loads platform specific json assets like appsettings.android.json, appsettings.ios.json, appsettings.maccatalyst.json, & appsettings.apple.json

Notifications

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

Push

Enhancement
ANDROID
Android 13 Support for new POST_NOTIFICATION permissions
Enhancement
Now works on new xplat lifecycle management from Core
Enhancement
nternally rewritten to make architecture easier going forward - firebase, azure, etc all become plugins on top of native instead of full implementations

Locations

Enhancement
APPLE
You can now control location manager properties like ActivityType and ShowsBackgroundLocationIndicator via AppleLocationConfiguration service
Enhancement
ANDROID
To configure the foreground service notification, your IGpsDelegate can also implement IAndroidForegroundServiceDelegate with ANDROID preprocessor directives

BluetoothLE

Enhancement
ANDROID
RequestAccess(bool connect) now allows you to additionally request access to GATT connections (defaults to true). This allows Shiny to use Android API 31 properly. It will always ask for scan permissions.
BREAKING
Enhancement
ANDROID
Adapter control is no longer support through the Shiny API, but you do have raw access to the native adapter if needed
BREAKING
Enhancement
Managed scan now require you to set scan configuration values in Start instead of the constructor & property setters
BREAKING
Enhancement
The API has been simplified and no longer requires you to maintain (and refresh) instances of services/characteristics/descriptors
BREAKING
Enhancement
Managed peripheral is now gone. This functionality is now built into the main API.
BREAKING
Enhancement
ANDROID
Android MTU requests are moved to the IPeripheral.Connect(AndroidConnectionConfig)

BluetoothLE Hosting

Enhancement
ANDROID
RequestAccess now exists - you can specifically target your permissions to take advantage of Android API 31
Enhancement
All characteristic hooks are now async
Enhancement
New “managed” model for characteristics
Enhancement
Advertise iBeacons is now supported - it exists here instead of Shiny.Beacons because all of the advertising code is here

HTTP Transfers

Enhancement
Rewritten API makes it easier than ever to monitor metrics of your transfers
Enhancement
ANDROID
Now supports persistent progress notifications
Enhancement
You can pass AppleHttpTransferRequest & AndroidHttpTransferRequest to the HttpTransferManager to customize the native request

Beacons

Enhancement
ANDROID
To configure the foreground service notification on beacon monitoring, your IBeaconMonitorDelegate can also implement IAndroidForegroundServiceDelegate with ANDROID preprocessor directives

Jobs

BREAKING
Enhancement
IOS
We no longer support the background fetch style (old) job management - only bgtasks will be used going forward

Libraries that will not move to v3

  • Shiny.NFC
  • Shiny.Sensors

MAUI Setup

  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

// 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    
}