Skip to content

Releases

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
    IOS
    Crash tapping local notification on iOS earlier than 16 when accessing FilterCriteriaGitHubIssue number=1366 />

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

Enhancement
Moving from .NET 7 to .NET 8
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
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    
}