Skip to content

Client Release

4.0.0 - TBD 2024

Core

  • BREAKING Enhancement
    Shiny will now only target .NET 8 or higher

Push

  • Enhancement iOS
    You can now IFDEF IOS to get an AppleNotification that contains the raw NSDictionary
  • Enhancement iOS
    We now maintain our own Firebase FOCUSED (slim) binding that is used by Shiny.Push.FirebaseMessaging

Locations

  • Fix
    The base GpsDelegate calculations could receive a batch and trigger multiple calculations. This has been made into a synchronized operation

PLANNED

Locations

  • Enhancement iOS
    GPS background will now request background permission right away

Local Notifications

  • BREAKING Enhancement
    RequestAccess & RequestRequiredAccess(Notification) now return a NotificationAccessState which includes states for all the various permissions needed for a notification
  • Enhancement
    INotificationManager.GetCurrentAccess added which allows you to get current permission set without requesting access from user
  • BREAKING Enhancement iOS
    IAppleNotificationManager now allows more ways to control the native platform

3.3.3 - April 8, 2024

Push

  • Fix Android
    OnEntry intent action was not being defaulted if not set
  • Enhancement Android
    OnReceived now sends an AndroidPushNotification which gives you access to the native message as well as helper methods to send the notification if in the foreground
public class MyPushDelegate : IPushDelegate
{
public void OnReceived(PushNotification notification)
{
#if ANDROID
var android = (AndroidPushNotification)notification;
// android.NativeMessage;
var builder = android.CreateNotificationBuilder();
android.SendNotification(1, builder);
#endif
}
}

3.3.2 - March 29, 2024

Push

  • Enhancement Android
    Ability to set a custom push intent instead of the Shiny static string
  • Enhancement
    Ensure OnRegistered is always called

3.3.1 - March 26, 2024

Push

  • Fix Android
    IPushDelegate.OnRegistered was being called twice during IPushManager.RequestAccess calls
  • Fix Android
    IPushDelegate.OnRegistered was not passing provider token

3.3.0 - March 18, 2024

Core

  • Fix
    Allow for keyed services
  • Fix
    ObservableList index out of range

HTTP Transfers

  • Enhancement iOS
    Allow fine tuned control of the nsurlsessionconfiguration and the mutable native request on iOS via implementing (& registering) INativeConfigurator

BluetoothLE

  • Fix Android
    IBleDelegate now reports adapter state properly
  • Fix Android
    BleDelegate does not fire for disconnected event on Android
  • Fix Android
    Unsubscribing from a connection may be temporarily unstable if sub/unsub is performed rapidly
  • Fix Android
    Reduce logging severity for characteristic events
  • Fix iOS
    IsScanning flag was not being set
  • Fix
    Characteristic extension (GetAllCharacteristics) was only returning characteristics from last service
  • Fix
    Characteristic async extension signature fixes

Local Notifications

Push

  • BREAKING Enhancement
    PushDelegate now contains an OnUnRegistered event
  • BREAKING Enhancement
    PushDelegate.OnTokenRefreshed has been renamed to OnNewToken to be more concise as to its purpose
  • Enhancement Android
    Firebase will not attempt to initialize if it done by other libraries like Firebase Crashlytics
  • Enhancement
    Microsoft.Azure.NotificationHubs updated to 4.2.0 for FCMv1 parameter which is set as default now
  • Enhancement
    IPushManager now access NativeRegistrationToken which is useful for debugging purposes

Speech Recognition

  • BREAKING Enhancement
    This module is now deprecated since Community Toolkit also has an offering in this space

AppCenter Logging

  • BREAKING Enhancement
    AppCenter has officially announced they are shutting down in 2025, so this library has been removed

3.2.4 - February 3, 2024

Push

  • Enhancement iOS
    IPushManager.RequestAccess now return AccessState.Unsupported on the simulator instead of letting an exception be thrown
  • Enhancement
    Old extensions for tags added back to IPushManager

3.2.3 - January 18, 2024

HTTP Transfers

  • Fix Android
    Ensure HTTP transfer foreground service does start multiple times
  • Fix Android
    Check for the presence of FOREGROUND_SERVICE_DATA_SYNC on API 34

Push

  • Enhancement Android
    Ability to configure intent action during registration

3.2.2 - January 3, 2024

Locations

  • Enhancement Android
    Replace deprecated location request used in Android GPS request

Local Notifications

  • Fix
    Crash tapping local notification on iOS earlier than 16 when accessing FilterCriteria

Push - Azure Notification Hubs

3.2.1 - December 19, 2023

Core

Enhancement Android
Use ServiceCompat to start and stop android foreground service

Locations

Fix Android
Ensure post_notifications permissions is also requested

Configuration

Enhancement
You can now pass environment variable to configuration that will allow to use file name likes appsettings.apple.debug.json

AppCenter Logging

Enhancement
Support for scopes

3.2.0 - December 8, 2023

Core

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

Locations

Fix Android
GPS won’t always auto-restart post reboot

BLE Hosting

Fix Android
Managed BLE Services won’t always auto-restart post reboot

3.1.2 - November 7, 2023

Core

Enhancement Android
No longer emits notification for “foreground” service on older Android versions

Local Notifications

Enhancement Android
Using AndroidNotification, you can now set the android specific Category

Jobs

Fix
Base Job was not calculating runtime difference properly

3.1.1 - November 1, 2023

Locations

Fix Android
GPS Foreground Service start/stop fix

Local Notifications

Fix Android
Listen to activity.OnCreate intents

3.1.0 - October 26, 2023

Core

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

HTTP Transfers

Fix Android
More aggressive retrying of transfers in queue
Fix Android
Appropriate amount of wizardary applied to remove foreground service notifications

Push

Enhancement iOS
IPushDelegate can now add IApplePushDelegate on Apple platforms to manage certain specific return values (UIBackgroundFetchResult & UIPresentationOptions) - Example below
Fix Android
OnEntry now responds to OnCreate for new activities
#if IOS
using UIKit;
using UserNotifications;
#endif
public partial class MyPushDelegate : Shiny.Push.IPushDelegate
{
// .. left empty for brevity
}
#if IOS
public partial class MyPushDelegate : Shiny.Push.IApplePushDelegate
{
// this is executed only in the foreground
public UNNotificationPresentationOptions? GetPresentationOptions(PushNotification notification)
{
return UNNotificationPresentationOptions.Alert;
}
// executed for all content-available notifications
public UIBackgroundFetchResult? GetFetchResult(PushNotification notification)
{
return UIBackgroundFetchResult.NewData;
}
}
#endif

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

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
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 Android
Adapter control is no longer support through the Shiny API, but you do have raw access to the native adapter if needed
BREAKING
Managed scan now require you to set scan configuration values in Start instead of the constructor & property setters
BREAKING
The API has been simplified and no longer requires you to maintain (and refresh) instances of services/characteristics/descriptors
BREAKING
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 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
}