Shiny MAUI Shell v7 - App Links, App Shortcuts, & Navigation Interception!Shortcut me to it
Live Activities Releases
5.6.0 - September 11, 2026
Section titled “5.6.0 - September 11, 2026”FeatureAndroid
The notification channel is no longer hard-coded English.
AddLiveActivities(configure) and AddLiveActivities<TDelegate>(configure) take a new LiveActivityOptions carrying ChannelName and ChannelDescription - what the user reads in Android’s per-app notification settings. They are re-applied on every startup rather than only at first channel creation, because Android treats a repeat registration with the same channel id as an update to those two fields, so a translation that ships after first launch still reaches the settings screen. Channel importance and sound stay unconfigurable on purpose: Android ignores both once the channel exists, and from that point they belong to the user. iOS is unaffected - an ActivityKit activity has no channel.Feature
New module:
Shiny.Mobile.LiveActivities. One typed API in front of the persistent, updating status surface both phone platforms grew independently - iOS/iPadOS Live Activities (ActivityKit, Lock Screen and Dynamic Island) and Android 16 Live Updates. ILiveActivityManager starts, updates and ends them; LiveActivityContent carries title, body, short status, progress, stale date, relevance score and a free-form string/string data bag your own widget reads. The shared contract is a state, not a UI tree, so the two platforms cannot drift in what they say. See Getting Started.FeatureiOS
ActivityKit is Swift-only with no Objective-C interface, so it is reached through an
@objc shim built from an Xcode project and shipped as Shiny.iOS.LiveActivities.Binding - pulled in automatically, never referenced directly. Requires iOS/iPadOS 16.2+ and a SwiftUI widget extension in the app bundle; a ready-made one ships in templates/WidgetExtension and its Swift is compile-checked in CI. See The iOS Widget Extension.FeatureAndroid
Android 16 (API 36+) uses
Notification.ProgressStyle with requestPromotedOngoing and setShortCriticalText, earning the status bar chip and always-on-display treatment. Android 8-15 degrades to an ordinary ongoing notification with a determinate progress bar. RequestAccess() asks for POST_NOTIFICATIONS on API 33+.FeatureiOS
Both APNs token kinds are surfaced through
ILiveActivityDelegate: OnPushTokenChanged for a single activity’s update token, and OnPushToStartTokenChanged for the device’s push-to-start token (iOS 17.2+), which lets a server start an activity with the app closed. They pair with PushTokenKind.LiveActivityUpdate / .LiveActivityStart in Shiny.Extensions.Push. Send an ordinary alert to one of these and APNs answers DeviceTokenNotForTopic, so keep the kinds separated. See Push Tokens & Server Updates.Feature
LiveActivityProgress.FromRange(start, end) emits a self-animating time range the system advances on its own, instead of a fixed fraction. Strongly preferred for anything time-based: every push update costs budget, and a suspended iOS app sends none at all, so a fraction-based bar freezes until the app wakes.Feature
LiveActivityContentSchema is public - the JSON contract shared by this library, the Swift ShinyActivityAttributes.ContentState a widget renders, and the content-state a server pushes - so a server payload can be built or verified against exactly the shape the app produces. Note that dates inside content-state are seconds since 2001-01-01 (Swift’s stock Codable encoding), not Unix; a drift here does not throw, it silently stops the activity refreshing.Chore
Mobile only, and the package name says so. iOS/iPadOS and Android are the entire supported list; macOS, Mac Catalyst, tvOS, Windows, Linux and Blazor resolve
NoOpLiveActivityManager, where IsSupported is false and every call is a safe no-op - so shared view models need no platform checks. There is no Apple desktop implementation to add: ActivityKit.framework ships in the macOS SDK, but every public type in it is annotated @available(macOS, unavailable) / @available(macCatalyst, unavailable) / @available(tvOS, unavailable) / @available(watchOS, unavailable). What a Mac shows is an iPhone’s activity mirrored over iPhone Mirroring, which no Mac app declares or drives - hence Shiny.iOS.LiveActivities.Binding rather than Shiny.Apple.*.

