2.6.3 September 25, 2022
BluetoothLE
- [Android] Removing BLUETOOTH_PRIVILEGED permission
Push - Firebase
- [Android][Fix] Delegate method was no longer being detected
2.6.2 August 25, 2022
NFC
- [Fix][iOS] Read errors on certain tag/ndef types
BluetoothLE
- [Enhancement][Android] Improved error messaging with regards to missing manifest permissions
2.6.1 August 15, 2022
Bluetooth LE
- [Fix][Android] Remove another old permission that is only needed for everything before Android 12
2.6.0 August 9, 2022
Core
- [Fix] InvokeTaskOnMainThread separated from InvokeOnMainThreadAsync to fix wrong signatures being used internally
BluetoothLE
- [Enhancement][Android] Now only requests BLUETOOTH_SCAN and BLUETOOTH_CONNECT if necessary for API level 31 GH-1060
BluetoothLE Hosting
- [BREAKING][Enhancement] All characteristic hooks are now async
- [BREAKING][Android] All android specific properties and manufacturer data advertising options have been removed
- [Enhancement][Android] IBleHostingManager.RequestAccess(bool advertise = true, bool connect = true) allows user to request appropriate permissions
- [Enhancement][Android] Now only uses the appropriate on API level 31
- [Enhancement][Android] LocalName is now advertised
Notifications
- [BREAKING][Fix] Attachment (FileInfo) is now LocalAttachmentPath (string) to prevent confusion
- [BREAKING] Notification.Sound is now an enum with the following values:
- [iOS][BREAKING][Enhancement] Time Sensitive notifications are no longer used by default as they require an extra entitlement being setup, thus you must now specify NotificationManager.UseTimeSensitiveAlerts = true; on iOS in order to enable them
- [iOS][Fix] Time sensitive permission is only used if enabled, channel importance of high, and a scheduled date is set
- [iOS][Enhancement] Local notification acknowledgement now uses Banner instead of Alert to remove iOS deprecation GH-1055
- [Android][iOS][Fix] Notification.ImageUri is replaced with Notification.Attachment (FileInfo) as files must be local for attachments
HTTP Transfers
- [iOS][Fix] Error messages for downloads are now provided GH-1048
2.5.5 June 17, 2022
Core
- [Android][Fix] Generators will generate OnCreate. Only ShinyOnCreate has been removed since this hook is not required by Shiny any longer
BluetoothLE
- [Android][Fix] GattCharacteristic.GetDescriptors crash
2.5.4 - June 7, 2022
Locations
- [Android][Fix] Some devices were experiencing missed GPS readings
2.5.3 - June 1, 2022
Locations
- [Android][Fix] Geofencing startup would crash if permission had been removed GH-2013
2.5.2 - May 24, 2022
Notifications
- [Android][Fix] Notification permission on Android 11 & under
- [Fix] IntervalTrigger was not calculating next date properly when day was chosen
BluetoothLE
- [Fix] Managed peripheral notification "Key Exists Already"
- [iOS][Fix] Null safety on background scan
2.5.0 - May 5, 2022
Core
- [BREAKING][Android] Major target is now Android 12
- [Enhancement][Android] Bump all AndroidX libraries to next required version of Android 12 functionality
- [Enhancement] Improved boilerplate 3rd party library generation - now includes FFImageLoading
- [Enhancement] More extension methods (RX SwitchSelect, Task WithTimeout)
- [Enhancement] Internal improvements to repository
- [Enhancement] Generator now detects and initializes Xamarin.Forms.Maps
GPS
- [BREAKING] GpsAccuracy replaces Priority, Precise, Interval, ThrottledInterval, & MinimumDistance. These filters didn't work on iOS
Push
- [Android][Fix] OnEntry now works with click_action when set to SHINY_NOTIFICATION_CLICK
Push (Firebase)
- [Enhancement][iOS] Push to next major version of iOS firebase libraries
BluetoothLE
- [BREAKING][Enhancement] ManagedPeripheral has dropped ability to monitor any notification in favour of WhenNotificationReceived being a one stop shop for enabling/disabling notifications and restoring them on reconnections
- [Fix][Android] Peripheral.ReadRssi not working GH-913
- [Fix] ManagedPeripheral.WhenNotificationReceived was not checking equality properly for all characteristics GH-958
- [Fix][iOS] Service data had service UUID prefixed to the data GH-987
Bluetooth LE Hosting
- [Enhancement] MTU property now available on a connected peripheral GH-970
- [Enhancement] Service builder AddReadCharacteristic and AddWriteCharacteristic trap errors underneath the hood to send back failures to central. New signature also provides the actual central performing the action
Notifications
- [BREAKING] Badge is no longer a property - Use SetBadge (async) and GetBadge (async) instead (thank iOS for this change)
- [BREAKING] Clear is now Cancel
- [BREAKING] GetPending is now GetPendingNotifications
- [Enhancement] You can now set an ImageUri on notifications
- [Enhancement] Cancel allows for you to pass a scope of what to clear. DisplayedOnly - clears only notifications that are on the home screen. Pending - anything that has a trigger (geofence, schedule, interval). All - the default and does everything
- [Enhancement][Android] Android now uses exact timers as opposed to jobs
- [Enhancement][iOS] Channel importance now maps to iOS interruption level
- [Enhancement] Cross platform (repeatable) geofence based notifications
- [Enhancement] Ability to set thread (iOS)/group (Android) using notification.Thread
- [Enhancement][Android][iOS] Scheduled and Interval based repeatable notifications
2.4.3 (January 2022)
Bluetooth LE
- [Fix] ManagedPeripheral properly restores and set notifications GH-902
Locations
- [Enhancement][Android] RequestLocationUpdates now ensures main thread call
- [Fix][iOS] RequestAccess calls do not return immediately if user has previously denied access
2.4.2 (December 2021)
Core
- [Enhancement] Jobs is now included as part of Shiny codegen package
- [Fix] GenerateStaticClasses requires a namespace - removed optional arg on it
Jobs
- [Fix][iOS] Fallback job manager needs to requestaccess on the ui thread GH-835
Bluetooth LE
- [Fix] Ensure write is performed for ManagedPeripheral
- [Enhancement] Characteristic.WriteBlob now takes a timeout for individual packet sends
HTTP Transfers
- [Fix][iOS] Fix line endings for file upload headers
v2.4.1 (November 2021)
ALL
- Fix UWP target for all modules
HTTP Transfers
- [Fix][iOS] Additional header for file uploads (Big thanks to Guido Neele for all his help on this)
v2.4.0 (November 2021)
Core
- [BREAKING][Android] Now targets Android 11 by default
- [Fix] Message bus named events were not being published properly GH-772
- [Fix] Android 11+ opens a complete app when requesting permissions for location, thus permission requests could fail on Shiny in race scenarios. Shiny no longer checks if the request is made on the foreground
- [Fix] Message bus named broadcast was not publishing GH-772
- [Enhancement] Now using latest versions of Microsoft Extensions
BluetoothLE
- [Fix][Android] Background permission is no longer inserted into the manifest
Locations
- [Fix][Android] Location permissions for background must be done separate from other permissions now as per Android 11+
- [Fix][Android] Locations permission on Android 12 requires coarse & fine permissions, even if you only need fine
- [Fix][iOS] Background was not respecting deferrals GH-783
- [Enhancement][Android] Background permission is no longer enforced on package, but will throw an exception if it is requested and not put in the manifest
- [Enhancement][Android] Motion activity permission is no longer inserted automatically into your AndroidManifest.xml. An exception is thrown in its place if it is not present in the manifest when it is requested.
- [Enhancement][Android] GpsRequest now has GpsBackgroundMode (None, Standard, RealTime). Realtime creates the foreground service & background is a periodic ping with GPS coordinates
- [Enhancement][iOS][Android] GpsRequest now has Precise (Android: Fine) that (on Android requests) ensures fine requirements are met or at least return AccessState.Restricted when they are not
Notifications
- [Fix][Android] Channels were not being set GH-774
HTTP Transfers
- [Fix][Android] Add postdata to uploads multipart content GH-761
- [Fix][Android] Ensure final response from upload is successful GH-771
- [Fix][iOS] Fix invalid uploads not working GH-782
- [Fix][iOS] Ensure delegate OnCompleted is called when upload is completed GH-782
- [Enhancement][iOS] Now uploads files using form-data to ensure a consistent experience across platforms GH-794
- [BREAKING][UWP] Uwp has been removed, however, you can use the netstandard httpclient drivers
v2.3.0 (October 2021)
Core
- [BREAKING] Jobs has been moved from Shiny.Core to its own module Shiny.Jobs
- [BREAKING][iOS] Default store is now secure storage (KeyChain) to deal with potential auto-start issues before device has been unlocked
- [Enhancement] Object binding failures now log specifics on what failed
- [Fix] Startup registration was failing on optional delegates
- [Fix] Update job registration to Shiny.Jobs
BluetoothLE
- [Fix] Managed Scan Result now returns as IAdvertisementData for consistency
- [Fix] ManagedScan.Start is now async to expose permission issues before starting the scan GH-698
- [Fix] ManagedScan.Toggle has been moved to an extension method
Beacons
- [Enhancement] Managed beacon ranging scan now has Start as async so permissions can be checked
- [Fix] ManagedBeacon result now includes the region identifier
Locations
- [Enhancement] GpsManager.GetCurrentPosition will start/stop the GPS tracking only if it wasn't started before
- [Enhancement] IGpsManager.StartAndReceive starts GPS when subscribe and turns it off when unsubscribed OR the app goes to the background
- [Fix] GPS setting state is only written to settings if background is used
- [Fix][iOS] Will only attempt to auto-start the GPS tracking in background if authorization status has been fully granted (Always Allow)
Jobs
- [Enhancement] UsesJobs now allows you to manually register the job manager - RegisterJob will call this automatically
- [Enhancement] Foregrounding is now always available if you set your job as "RunInForeground", there is no need to call UseForegroundJobs
- [Fix][iOS] BGTasks - Correct filters applied to all modes
- [Fix] Move up exception base for missing job types due to the job being deleted or renamed GH-762
Notifications
- [Enhancement] Foreground service notifications will use channel that does not show application badge notification GH-734
- [Enhancement] Custom sounds work for critical notifications GH-757
Push
- [BREAKING] IPushDelegate.OnTokenChanged is now called IPushDelegate.OnTokenRefreshed
- [BREAKING] Channels are no longer registered within Push. Use INotificationManager to do this. If you need more customization over notification, send data messages and use INotificationManager
- [Fix][Android] OnEntry now functions under all modules
- [Fix][iOS][Native] IPushDelegate.OnTokenChanged is no longer called by RequestAccess and the proper token is returned
Push - Azure Notification Hubs
- [Fix] ANH can often fail with "Microsoft.Azure.NotificationHubs.Messaging.MessagingEntityNotFoundException: Installation not found.TrackingId:XXXX" for rapid calls (ie. RequestAccess immediately followed by SetTags)
- [Enhancement] You can now configure a timespan for when azure installations should expire if not used.
v2.2.0 (July 30, 2021)
Core
- [BREAKING] Shiny now uses it's own logger factory for Microsoft.Extension.Logging to provide a huge startup performance boost though this may break 3rd party providers. Shiny comes with Debug, Sqlite, and AppCenter out-of-the-box and they all work! GH0625
- [Enhancement] Source generators will initialize Dan Siegel's excellent Mobile.BuildTools.Configuration if present
- [Enhancement] Add the necessary constructor to ShinyStartup to register xplat services
- [Enhancement][Android] Xamarin.Essentials is now wired in automatically by the source generators for Activity OnResume and OnNewIntent GH-620
- [Enhancement][iOS] Xamarin.Essentials is now wired in automatically by the source generators for AppDelegate OpenUrl (if MSAL is not present) and PerformActionForShortcutItem
- [Enhancement] New startup helper (services.ClearJobQueueBeforeRegistration) - this will clear any previously registered jobs before registering new startup jobs - this is useful if you only use startup jobs and you want to clean up potentially old versions of jobs
- [Fix] Ensure global is generated in front of startup and XF app type names to ensure there is no collisions with other types
- [Fix][Android] Activity handler was not sending out proper resume state GH-640
- [Fix][Android] Platform state was not monitoring properly GH-640
- [Fix] Job foregrounding won't run your job multiple times on startup
- [Fix] BgTaskJobManager now calls the proper tasked jobs
- [Fix] Ensure all state bindables are completed before startup tasks
BluetoothLE
- [BREAKING] IBleManager.WhenAccessStatusChanged & IBleManager.Status removed - RequestAccess is a one stop shop
- [Fix][Android] IBleManager.WhenStateChanged now responds properly on Android 10+
- [Fix][Android] Pairing response now responds properly to accept and cancel of a request
- [Fix] Device Info extension method was not returning properly
Locations
- [BREAKING] IGpsManager/IGeofenceManager.WhenAccessStatusChanged & IGpsManager/IGeofenceManager.Status removed - RequestAccess is a one stop shop
- [Enhancement] New extensions IGpsManager.GetCurrentPosition or IGpsManager.GetLastReadingOrCurrentPosition
- [Enhancement] NEW GetCurrentPosition will now engage the GPS and wait for a reading as opposed to GetLastReading which will only give the last reading if available
- [Fix][Android] Automatically ensure notifications are registered for foreground service GH-653
- [Fix] GetLastReading will now request a reading if no location is current set on all platforms
Beacons
- [BREAKING][Android] BeaconMonitorConfig is now a required parameter and requires you set the ScanServiceUuids property to allow for proper background scanning. Check your beacon provider for what this value should be.
- [Fix][Android][UWP] Allow multiple beacon regions to be ranged at once
- [Fix][Android][UWP] Allow additional beacon packet sizes
- [Enhancement][Android][UWP] Non-standard iBeacons are now supported
Sensors
- [BREAKING] Heart rate sensor has been removed - too many people were having issues with linker and iOS "health" permission request
- [Enhancement][Android] Compass accuracy is now implemented
v2.1.1 (July 2, 2021)
Push - Azure Notification Hubs
- [Fix][iOS] Missing logger was causing NRE's
Locations
- [Android][Fix] Geofencing now checks all permission properly #623
v2.1.0 (June 10, 2021)
Core
- [BREAKING][UWP] UWP has new boilerplate requirements
- [Fix][UWP] Application Data Settings issue with duplicate keys
- [Enhancement] RX helper - SelectAsync
- [Enhancement][Android] Improved permission requests
- [Enhancement] Under the hood improvements to state restoration and startup tasks
- [Enhancement] IPlatform now includes InvokeOnMainThread x-plat calls
Code Generator
- [Fix][iOS] MSAL wireup had a bad reference
- [Fix][Android] Generated activity code for RG popups call was wrong 591
- [Fix] Improve root namespace detection to deal with weird project/assembly names
BluetoothLE
- [Fix] Managed Peripheral was not respecting notify vs indicate when restoring subscriptions
- [Fix] Managed Scan will filter dead buffers (no scan results)
- [Fix] Managed Scan now has configurable buffer time - IManagedScan.BufferTimeSpan
- [Fix][Android] BLE Delegate OnConnected PR
- [Fix][UWP] BLE Scans would return null results
- [Fix][Android] Many flavours of Droid won't fire Connecting/Disconnecting. Shiny now covers the Connecting portion of this.
- [Fix][Android] Push adapter status events to both delegate and observable
- [Enhancement][Android][UWP] Support for 16bit UUID strings
- [Enhancement][Android] Improved synchronization mechanism
BLE Hosting
- [Enhancement][Android][UWP] Support for 16bit UUID strings
Beacons
- [Fix] UseBeaconMonitoring in startup was returning false (unsupported) even though it had successfully been registered
- [Fix] Improved argument checks on beacon region
Notifications
- [Feature][Android] App Icon badge numbers are now supported thanks to Xamarin.ShortcutBadger
- Repository extensions were internalized as they were meant to be used outside of the library
- [Fix][Android] Foreground services wouldn't log issues with the notification if something was setup wrong
Push - Azure Notification Hubs
- [Fix][iOS] Device token could be invalid
Speech Recognition
- [Feature] Ability to pass cultureinfo to listening functions #569
NFC
- [Android][Fix] Uses wrong NFC manifest feature #585
v2.0.2639 (May 5, 2021)
Core
- [BREAKING] Jobs no longer return Task of bool, they now only return Task
- [BREAKING][Android] All previous monikers have been removed, only android 10+ targets are supported now, this includes only AndroidX compatibility
- [BREAKING] Caching has been removed. Use Microsoft.Extensions.Caching
- [FEATURE] Source Generators - Generate all of the boilerplate needed by Shiny for iOS & Android with nothing more than a single assembly attribute. Simply install Shiny (not Shiny.Core) on your head iOS & Android projects
- [BREAKING] All Shiny logging has been replaced with Microsoft.Extensions.Logging
- [BREAKING] Settings is now gone - enter key/value stores with file, memory, settings, and secure storage
BluetoothLE
- [BREAKING] The original library has been split into 2 separate libraries (Client - Shiny.BluetoothLE and Server - Shiny.BluetoothLE.Hosting) with some common ties
- [BREAKING] DiscoverServices is now called GetServices and returns IEnumerable instead of a single service
- [BREAKING] DiscoverCharacteristics is now called GetCharacteristics and returns IEnumerable instead of a single characteristic
- [Feature] You don't like RX - there are new async extensions to skip the RX
- [Feature] ManagedScan now properly manages an observable collection of peripherals using all the best practices for safely updating the collection and even removing peripherals that haven't been seen for a configured time period
- [Feature] ManagedPeripheral now manages everything during the reconnection process like resubscription to characteristics and all of the internal discovery is done for you. No more mass setup per peripheral connection.
Beacons
- [BREAKING] Beacons are now separated into 2 different injection points, services.UseBeaconMonitoring()/IBeaconMonitoringManager and services.UseBeaconRanging()/IBeaconRangingManager
- [Feature][Android] Uses foreground services to achieve real time beacon scanning while your app is in the background
- [Feature] ManagedScan now properly manages an observable collection of beacons using all the best practices for safely updating the collection and even removing beacons that haven't been seen for a configured time period
Locations
- [BREAKING] IsListening is gone in favor of CurrentListener configuration
- [Feature][Android] Now uses foreground service to achieve fast "background" GPS
- [Feature] Minimum Distance is now supported on Android and iOS
Notifications
- [BREAKING][Feature] Channels - this exists to fit with the Android channels model and iOS category model
- [Feature][Android] More Android specific configuration added
Push
- [BREAKING] Delegate now returns a type of PushNotification for OnReceived
- [BREAKING] Delegate now returns a type of PushNotificationEntry for OnEntry
- [BREAKING] WhenReceived foreground listener returns type of PushNotification
- [Feature] New Firebase provider for iOS and Android (Shiny.Push.FirebaseMessaging)
- Azure Notification Hubs provider is now fully released
NFC