npx claudepluginhub davidortinau/maui-skills --plugin maui-skillsThis skill uses the workspace's default tool permissions.
| Issue | Fix |
Implements geolocation in .NET MAUI apps using Microsoft.Maui.Devices.Sensors for one-shot/continuous location, permissions across Android/iOS/macOS/Windows, accuracy levels, mock detection, and CancellationToken handling.
Provides MapKit patterns for iOS: SwiftUI Map vs MKMapView, annotations, MKLocalSearch, directions, clustering, performance optimization, and debugging display issues.
Implement, review, or improve MapKit maps, annotations, routes, and CoreLocation tracking, geocoding, search, geofencing in SwiftUI iOS/macOS apps.
Share bugs, ideas, or general feedback.
| Issue | Fix |
|---|---|
| Map is blank on Android | Google Maps API key missing or wrong in AndroidManifest.xml |
| Map crashes on startup | .UseMauiMaps() not called in MauiProgram.cs |
Map type ambiguous | Conflicts with Microsoft.Maui.ApplicationModel.Map — add namespace alias |
| Map doesn't show on Windows | Windows has no native support — must use CommunityToolkit.Maui.Maps |
| User location dot missing | IsShowingUser="True" set but location permission not granted |
| Android 11+ can't launch external map app | Missing <queries> for geo scheme in manifest |
Microsoft.Maui.Controls.Maps.Map conflicts with Microsoft.Maui.ApplicationModel.Map. This causes confusing compile errors.
// ✅ Correct — explicit alias
using Map = Microsoft.Maui.Controls.Maps.Map;
<!-- ✅ Correct — namespace prefix in XAML -->
xmlns:maps="clr-namespace:Microsoft.Maui.Controls.Maps;assembly=Microsoft.Maui.Controls.Maps"
<maps:Map ... />
<!-- ❌ Wrong — bare <Map> is ambiguous -->
<Map ... />
<application><!-- ✅ Correct -->
<application ...>
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR_GOOGLE_MAPS_KEY" />
</application>
<!-- ❌ Outside <application> — key is silently ignored -->
⚠️ Also required: Google Play Services version meta-data and <queries> for geo scheme on API 30+ (see references/maps-api.md).
⚠️ Without NSLocationWhenInUseUsageDescription in Info.plist, location permission is denied without prompt.
Must add CommunityToolkit.Maui.Maps + Bing key. Use conditional package reference and #if WINDOWS for setup.
// ✅ Required — without this, Map control throws at runtime
builder.UseMauiMaps();
// ❌ Forgetting this causes "No registered handler for Map" crash
ItemsSource with data binding for large pin sets.MoveToRegion() to avoid the default world view zoom animation.MoveToRegion() calls — each triggers a map animation; debounce if driven by data changes.<!-- ✅ Correct — data-bound pins for dynamic collections -->
<maps:Map ItemsSource="{Binding Locations}">
<maps:Map.ItemTemplate>
<DataTemplate>
<maps:Pin Label="{Binding Name}"
Address="{Binding Description}"
Location="{Binding Position}" />
</DataTemplate>
</maps:Map.ItemTemplate>
</maps:Map>
<!-- ❌ Wrong — manually adding pins in code-behind for data-driven scenarios -->
| Need | Approach |
|---|---|
| Basic map with pins | Map control + Pins.Add() or ItemsSource binding |
| Map with shapes | MapElements — Polygon, Polyline, Circle |
| Address → coordinates | Geocoding.Default.GetLocationsAsync(address) |
| Coordinates → address | Geocoding.Default.GetPlacemarksAsync(lat, lon) |
| Custom map overlays | Use handlers to access native map APIs |
| Windows support | Must add CommunityToolkit.Maui.Maps + Bing key |
Microsoft.Maui.Controls.Maps added.UseMauiMaps() called in MauiProgram.cs<application> in AndroidManifest.xml<queries> for geo scheme addedNSLocationWhenInUseUsageDescription in Info.plistCommunityToolkit.Maui.Maps + Bing Maps key (conditional)Map type conflict