Skip to content
Document DB v12 - Improved Interceptors with Soft Delete Integration, AI protections, & Admin UI with Aspire Integration!How!?

Push Notifications Releases

FixiOS
FCM registration no longer hangs. The Core and Cloud Messaging Swift shims shipped in separate xcframeworks, and because the Firebase SPM products are statically linked, each framework embedded its own copy of FirebaseCore - so FirebaseApp.configure() configured one FIRApp while the token request read a second, unconfigured one. IPushManager.RequestAccess() awaited a native completion block that never fired: no token, no exception, no IPushDelegate.OnNewToken, and only an objc[...]: Class FIRApp is implemented in both ... warning at startup as a clue. All three shims now build into a single ShinyFirebase framework with one embedded FirebaseCore. Thanks to @ThomasManson for the diagnosis
BREAKINGiOS
The Shiny.Firebase.Analytics.iOS.Binding and Shiny.Firebase.Messaging.iOS.Binding packages are replaced by a single Shiny.Firebase.iOS.Binding. Shiny.Push.FirebaseMessaging picks it up automatically - no change is needed unless you referenced a binding package directly, in which case swap the reference and change the namespace to Shiny.Firebase.iOS.Binding. The managed type names (FirebaseApplication, FirebaseMessaging, FirebaseAnalytics) and their members are unchanged
FixiOS
FirebaseAnalytics.SetUserProperty was bound to the wrong Objective-C selector and would have thrown unrecognized selector at runtime
EnhancementiOS
The native messaging shim now fails fast instead of hanging - when Firebase has not been configured, RequestAccess() throws Firebase has not been configured rather than awaiting a completion block that will never fire
Fix
Shiny.Push.FirebaseMessaging is now built with IsAotCompatible and the generic AddPushFirebaseMessaging<TPushDelegate> overload forwards the DynamicallyAccessedMembers annotation its registration requires. Without it the trimmer was free to remove the delegate’s constructor and interface map, so a trimmed app could fail to resolve IPushDelegate at startup with no build-time warning.
Fix
Shiny.Push.AzureNotificationHubs no longer throws No JsonTypeInfo registered for type 'System.String[]' when reading or writing RegisteredTags - the package now ships a source-generated JSON context registering the string[]/List<string> used by its key/value store persistence.
Feature
macOS support added via APNs - Shiny.Push
Feature
Windows support added via Windows Notification Service (WNS) - Shiny.Push
Feature
Blazor WebAssembly (Web) support added via the Web Push (VAPID) standard - new Shiny.Push.Blazor package. Requires HTTPS, a VAPID key pair, and a service worker; Safari requires the user to install the PWA before subscribing
FeatureiOS
Firebase Cloud Messaging on iOS via native bindings - new Shiny.Push.FirebaseMessaging package. Exchanges the APNs token for an FCM registration token and maps tags to FCM topic subscriptions through IPushTagSupport; Android continues to use the built-in Shiny.Push Firebase support
EnhancementiOS
You can now IFDEF IOS to get an AppleNotification that contains the raw NSDictionary
Enhancement
Azure Notification Hubs now allow template registrations
  • FixAndroid
    OnEntry intent action was not being defaulted if not set
  • EnhancementAndroid
    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
}
}
  • EnhancementAndroid
    Ability to set a custom push intent instead of the Shiny static string
  • Enhancement
    Ensure OnRegistered is always called
  • FixAndroid
    IPushDelegate.OnRegistered was being called twice during IPushManager.RequestAccess calls
  • FixAndroid
    IPushDelegate.OnRegistered was not passing provider token
  • BREAKINGEnhancement
    PushDelegate now contains an OnUnRegistered event
  • BREAKINGEnhancement
    PushDelegate.OnTokenRefreshed has been renamed to OnNewToken to be more concise as to its purpose
  • EnhancementAndroid
    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
  • EnhancementiOS
    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
  • EnhancementAndroid
    Ability to configure intent action during registration
EnhancementiOS
IPushDelegate can now add IApplePushDelegate on Apple platforms to manage certain specific return values (UIBackgroundFetchResult & UIPresentationOptions) - Example below
FixAndroid
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
FixiOS
Provider push token is now returned by PushManager.RequestAccess instead of native token
EnhancementAndroid
Android 13 Support for new POST_NOTIFICATION permissions
Enhancement
Now works on new xplat lifecycle management from Core
Enhancement
Internally rewritten to make architecture easier going forward - firebase, azure, etc all become plugins on top of native instead of full implementations