Xamarin Plugins to .NET MAUI
Most Xamarin.Forms apps lean on a dozen or more plugins. Moving to .NET MAUI is mostly about finding where each of them went. Some are now part of MAUI itself, some have a MAUI release of their own, and the ones that ran work in the background (BLE, GPS, geofencing, jobs, push, transfers) are the ones most worth replacing rather than porting.
This page maps the common ones. Use it as a checklist: go through your .csproj PackageReferences and
find each one below.
Built into .NET MAUI
Section titled “Built into .NET MAUI”These need no package at all. The APIs live in Microsoft.Maui.* and ship with the MAUI workload.
| Xamarin package | On .NET MAUI |
|---|---|
Xamarin.Essentials |
Built in (Microsoft.Maui.Devices, Microsoft.Maui.Storage, Microsoft.Maui.Networking, …) |
Plugin.Connectivity |
Connectivity (built in) |
Plugin.Permissions |
Permissions (built in). Shiny libraries request their own permissions. |
Plugin.Media |
MediaPicker (built in) |
Plugin.FilePicker |
FilePicker (built in) |
Plugin.Settings |
Preferences / SecureStorage (built in), or Shiny Stores for strongly-typed, bindable settings |
Plugin.TextToSpeech |
TextToSpeech (built in), or Shiny Speech for speech-to-text and cloud voices |
Xamarin.Forms.Maps |
Microsoft.Maui.Controls.Maps |
Xamarin.CommunityToolkit |
CommunityToolkit.Maui |
SkiaSharp.Views.Forms |
SkiaSharp.Views.Maui.Controls |
Device and background features → Shiny
Section titled “Device and background features → Shiny”These are the plugins that touched the OS beneath the app. Shiny’s libraries do the same jobs on MAUI and keep working in the background, which is usually what the Xamarin plugin couldn’t do reliably.
| Xamarin package | On .NET MAUI | Why switch |
|---|---|---|
Acr.BluetoothLE |
Shiny.BluetoothLE |
Shiny.BluetoothLE is what Acr.BluetoothLE became: same author, with background scanning and connections, reconnect handling and managed peripherals |
| BLE peripheral/GATT server code (hand-rolled) | Shiny.BluetoothLE.Hosting |
Advertising and GATT services from the phone, without platform code |
Plugin.Geolocator |
Shiny.Gps |
MAUI’s Geolocation covers one-off foreground fixes; Shiny covers continuous and background tracking |
Geofencing (hand-rolled, or Plugin.Geofencing) |
Shiny.Geofencing |
OS-managed geofences that fire with the app closed |
Plugin.FirebasePushNotification / Plugin.PushNotification |
Shiny.Push |
Native APNs and Firebase, or Azure Notification Hubs, behind one API |
Background jobs (Matcha.BackgroundService, hand-rolled WorkManager / BGTaskScheduler) |
Shiny.Jobs |
Runs on the OS schedulers on iOS and Android |
Background downloads/uploads (hand-rolled NSURLSession / DownloadManager) |
Shiny.Net.Http |
Transfers that survive the app being suspended or killed |
| iBeacon code | Shiny.Beacons |
Ranging and background monitoring |
Plugin.InAppBilling |
Shiny.Mobile.InAppPurchases |
Store purchases with server-side verification |
Plugin.Contacts |
Shiny.Contacts |
Read and write device contacts with a query builder |
Plugin.Calendars |
Shiny.Calendar |
Device calendar and event CRUD |
| Offline data + sync (hand-rolled, or Azure Mobile Apps offline sync) | Shiny.Data.Sync |
Background-capable bidirectional sync over HTTP |
Coming from Shiny on Xamarin
Section titled “Coming from Shiny on Xamarin”If the app already used Shiny 1.x or 2.x on Xamarin, most of the API carries over. The main changes:
- Startup. The Xamarin
ShinyStartupclass and the per-platformShinyHost.Initcalls are gone. AddUseShiny()toMauiProgram.csand register services onbuilder.Services. See MAUI hosting. - Locations split in two. GPS and geofencing are separate packages:
Shiny.GpsandShiny.Geofencing. - Platform boilerplate is gone.
UseShiny()wires the Android lifecycle callbacks and iOS app delegate methods that used to be pasted intoMainActivityandAppDelegate.
The v3 announcement covers what changed between the Xamarin and MAUI generations in more detail.
Before you start
Section titled “Before you start”- List every package.
dotnet list packageon each project, including the platform heads. The platform projects are where forgotten plugins hide. - Sort them into the three groups above. Built-in ones are a rename; the background ones are the real work; anything left over needs a check for a MAUI release, or a replacement.
- Check custom renderers. Xamarin.Forms renderers become MAUI handlers. Effects and renderers are usually the second-largest piece of work after background features.
- Test on real devices, early. Background behaviour on a simulator tells you very little. Test on the oldest OS version you support and on at least one aggressive Android OEM.
Need a hand?
Section titled “Need a hand?”ShinySoft maintains Shiny and does Xamarin → MAUI migrations for a living. If yours has stalled on background BLE, location or sync, see Commercial Support.


