.NET MAUI 10 Migration Plan

Updated: 2026-08-08 07:01 ET · Audited: 2026-06-26

Historical migration record — the migration completed in February 2026. This document describes the .NET MAUI 9 → 10 migration (January–February 2026) and the version snapshot taken at that time. Versions have moved on since. The live sources of truth are global.json (SDK version), Directory.Build.props (MauiVersion), and ALPAMobile/ALPAMobile.csproj (NuGet package versions) — check those files for current values. The version tables below state values as of 2026-08-08.
TL;DR: The .NET MAUI 9 → 10 migration is complete: the app builds with 0 errors on iOS and Android (.NET 10.0 / MAUI 10.0.10) at 100% feature parity, and builds are in production testing via TestFlight and Google Play Internal Track. All breaking-change categories (async animation methods, ListView → CollectionView, DisplayAlertAsync, Page.IsBusy, MessagingCenter) are resolved; remaining items are deferred warnings, two open bugs, and the Android staged rollout. Live status lives on the board: Epic AB#1810 — .Net 10 (the 2026-02-24 status snapshot is preserved in its discussion).
Version (as of 2026-08-08).NET SDK 10.0.203 (global.json) / MAUI 10.0.60 (MauiVersion in Directory.Build.props)
Migration PeriodJanuary–February 2026
StatusProduction Testing Phase
Estimated Effort6–8 weeks (Actual: 6 weeks)

Executive Summary

This document covers the completed migration of ALPA Mobile from .NET MAUI 9 to .NET MAUI 10. The migration addressed breaking changes (animation methods, ListView, MessagingCenter), deprecated APIs, third-party NuGet compatibility, and platform-specific changes (iOS trimmer, Android API 36).

Key results

Breaking Changes Resolved

1. Animation Methods (HIGH IMPACT) — Complete

All animation methods replaced with async variants. No explicit usage found in codebase — documented for future use.

MAUI 9 (Deprecated)MAUI 10 (Required)
FadeToFadeToAsync
RotateToRotateToAsync
ScaleToScaleToAsync
TranslateToTranslateToAsync
LayoutTo, RelRotateTo, RelScaleTo, ScaleXTo, ScaleYTo, RotateXTo, RotateYToRespective …Async variants

2. ListView Deprecation (CRITICAL) — Complete

Commit 768aa21 — 3 files updated: PilotGroupHotelsPage, InternationalDirectoryPage, JumpseatFlightFinderResultsFiltersPage.

Pattern: replaced IsGroupingEnabled with IsGrouped, removed ViewCell wrappers, added SelectionMode="Single" and BoxView separators. Deprecated: ListView, EntryCell, ImageCell, SwitchCell, TextCell, ViewCell. Note: already using CollectionView in many places prior to migration (DocumentCenterPage, HomePage, FTDTCADutyPeriodDetailsPage, AppShell).

3. DisplayAlert / DisplayActionSheet (MEDIUM) — Complete

60+ DisplayAlert calls updated to DisplayAlertAsync across 21 files. No DisplayActionSheet instances found. All calls already used await — zero compiler errors introduced.

Files updated include: Services/Authentication.cs, Services/DataManager.cs, Services/SharedActionsService.cs, Pages/FTDTSplitDutyPeriodPage.xaml.cs, Pages/PushNotificationsSettingsPage.xaml.cs, ViewModels/LoginPageViewModel.cs (7 instances), ViewModels/SettingsPageViewModel.cs (11 instances), ViewModels/FTDTCADutyPeriodDetailsPageViewModel.cs (14 instances), and 13 more.

4. Page.IsBusy (MEDIUM) — Complete

Commit 0e6d7ef — 40 files updated (164 insertions, 164 deletions). Renamed IsBusyIsLoading in BasePageViewModel and all consuming ViewModels/XAML. IsBusyIndicatorVisible in AutoLoginWebViewContentView was left unchanged (it is a separate custom bindable property).

5. MessagingCenter (MEDIUM) — Complete

No changes needed — codebase was already migrated to WeakReferenceMessenger (CommunityToolkit.Mvvm). Pattern: WeakReferenceMessenger.Default.Send(new MessageType(...)) / .Register<MessageType>(this, (r, m) => { }).

6. TableView (MEDIUM) — Complete

No <TableView> instances found in codebase — no migration needed.

7. Other APIs — Complete

Platform-Specific Changes

Android

iOS

New MAUI 10 Features Available

FeatureDetail
HybridWebView enhancementsWebViewInitializing / WebViewInitialized events; WebResourceRequested for intercepting requests
Nullable PickersDatePicker.Date and TimePicker.Time are now nullable (DateTime?, TimeSpan?); programmatic Open()/Close()
SearchBarSearchIconColor and ReturnType properties
SwitchOffColor property for off state styling
RefreshViewIsRefreshEnabled distinct from IsEnabled
XAML Source Generator<MauiXamlInflator>SourceGen</MauiXamlInflator> (opt-in)
.NET Aspire integrationOptional service defaults (OpenTelemetry, service discovery)

Build Results

ConfigurationErrorsWarningsBuild Time
iOS Debug063214.97s
iOS Release063518.11s
Android Debug063443.13s
Android Release06371:29.92

Key warning categories: CS0618 (LayoutOptions.*AndExpand — deferred), CS0612 (Device.GetNamedSize — deferred), CS8622 (nullability in event handlers), NU1903 (transitive dependency vulnerability in Microsoft.Extensions.Caching.Memory 6.0.1).

Testing Results

iOS (TestFlight build 20260220.2)

33/33 tests complete. 4 bugs found and fixed:

BugDescriptionPRStatus
#1833FTDT ScrollView locks on short content#1301Fixed
#1836iOS crash when logout during document sync#1307Fixed
#1837Login shows wrong error message (401→503)#1305 + #1310Fixed
#1838Flight search not cancelled on back navigation#1306Fixed
#1840Auth guards needed for DocumentCenter#1309On hold

Android (build 2798 / Pixel 9)

33/33 tests complete. 5 bugs found:

BugDescriptionSeverityStatus
#1881Flyout menu missing top margin on first launchLowResolved (PR #1311)
#1882Flight search swipe action icons too largeLowActive — fix attempt 2 in progress
#1883Misleading error message when offlineMediumResolved (PR #1311)
#1884Duplicate activity indicators on pull-to-refreshLowClosed — by design
#1886Login fails with misleading error when password has spacesMediumResolved (PR #1311)

Technology Stack (as of 2026-08-08)

Live sources of truth: SDK version in global.json, MauiVersion in Directory.Build.props.

Platform:          .NET MAUI 10.0.60   (MauiVersion, Directory.Build.props)
SDK:               .NET 10.0.203       (global.json)
Target Frameworks: net10.0-ios, net10.0-android
iOS Minimum:       15.0
Android Minimum:   API 28 (Android 9.0)
Xcode:             16.4
Build System:      Azure DevOps Pipelines

Key Dependencies (as of 2026-08-08)

Live source of truth: ALPAMobile/ALPAMobile.csproj — check it for current versions.

PackageVersionPurpose
CommunityToolkit.Maui13.0.0Expander, other controls
CommunityToolkit.Mvvm8.4.0ObservableObject, WeakReferenceMessenger
Sentry.Maui6.0.0Crash reporting
Microsoft.Identity.Client4.69.1MSAL authentication
Microsoft.Azure.NotificationHubs4.2.0Push notifications
Plugin.Firebase.CloudMessaging3.1.2FCM (Android)
LiteDB5.0.21Document cache (with iOS workaround)
ZXing.Net.Maui.Controls0.7.3Barcode scanning

Deprecated API Quick Reference

MAUI 9MAUI 10Impact
FadeTo, RotateTo, ScaleTo, TranslateTo…Async variantsHigh
ListViewCollectionViewCritical
TableViewCollectionViewMedium
DisplayAlertDisplayAlertAsyncMedium
DisplayActionSheetDisplayActionSheetAsyncMedium
MessagingCenterWeakReferenceMessengerMedium
Page.IsBusyActivityIndicatorLow
FontImageExtensionFontImageSourceLow
ClickGestureRecognizerTapGestureRecognizerLow

Remaining Open Items

Cross-References

DocumentLocation
.NET 10 migration status (board)Epic AB#1810 — .Net 10
Development guidedevelopment.html
Testing guidetesting.html
Crash investigation workflowcrash-investigation-workflow.html