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 Period | January–February 2026 |
| Status | Production Testing Phase |
| Estimated Effort | 6–8 weeks (Actual: 6 weeks) |
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).
All animation methods replaced with async variants. No explicit usage found in codebase — documented for future use.
| MAUI 9 (Deprecated) | MAUI 10 (Required) |
|---|---|
FadeTo | FadeToAsync |
RotateTo | RotateToAsync |
ScaleTo | ScaleToAsync |
TranslateTo | TranslateToAsync |
LayoutTo, RelRotateTo, RelScaleTo, ScaleXTo, ScaleYTo, RotateXTo, RotateYTo | Respective …Async variants |
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).
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.
Commit 0e6d7ef — 40 files updated (164 insertions, 164 deletions). Renamed IsBusy → IsLoading in BasePageViewModel and all consuming ViewModels/XAML. IsBusyIndicatorVisible in AutoLoginWebViewContentView was left unchanged (it is a separate custom bindable property).
No changes needed — codebase was already migrated to WeakReferenceMessenger (CommunityToolkit.Mvvm). Pattern: WeakReferenceMessenger.Default.Send(new MessageType(...)) / .Register<MessageType>(this, (r, m) => { }).
No <TableView> instances found in codebase — no migration needed.
FontImageExtension → already using <FontImageSource> elements (17 files)ClickGestureRecognizer → already using TapGestureRecognizerCompatibility.Layout → not found in codebaseEditor and Entry now use MauiAppCompatEditTextSafeAreaEdges enum for granular safe-area controlOrder="Secondary" → overflow menu)kcm_usage_procedures.pdf — fixed by removing redundant explicit include from ALPAMobile.csproj| Feature | Detail |
|---|---|
| HybridWebView enhancements | WebViewInitializing / WebViewInitialized events; WebResourceRequested for intercepting requests |
| Nullable Pickers | DatePicker.Date and TimePicker.Time are now nullable (DateTime?, TimeSpan?); programmatic Open()/Close() |
| SearchBar | SearchIconColor and ReturnType properties |
| Switch | OffColor property for off state styling |
| RefreshView | IsRefreshEnabled distinct from IsEnabled |
| XAML Source Generator | <MauiXamlInflator>SourceGen</MauiXamlInflator> (opt-in) |
| .NET Aspire integration | Optional service defaults (OpenTelemetry, service discovery) |
| Configuration | Errors | Warnings | Build Time |
|---|---|---|---|
| iOS Debug | 0 | 632 | 14.97s |
| iOS Release | 0 | 635 | 18.11s |
| Android Debug | 0 | 634 | 43.13s |
| Android Release | 0 | 637 | 1: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).
33/33 tests complete. 4 bugs found and fixed:
| Bug | Description | PR | Status |
|---|---|---|---|
| #1833 | FTDT ScrollView locks on short content | #1301 | Fixed |
| #1836 | iOS crash when logout during document sync | #1307 | Fixed |
| #1837 | Login shows wrong error message (401→503) | #1305 + #1310 | Fixed |
| #1838 | Flight search not cancelled on back navigation | #1306 | Fixed |
| #1840 | Auth guards needed for DocumentCenter | #1309 | On hold |
33/33 tests complete. 5 bugs found:
| Bug | Description | Severity | Status |
|---|---|---|---|
| #1881 | Flyout menu missing top margin on first launch | Low | Resolved (PR #1311) |
| #1882 | Flight search swipe action icons too large | Low | Active — fix attempt 2 in progress |
| #1883 | Misleading error message when offline | Medium | Resolved (PR #1311) |
| #1884 | Duplicate activity indicators on pull-to-refresh | Low | Closed — by design |
| #1886 | Login fails with misleading error when password has spaces | Medium | Resolved (PR #1311) |
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
Live source of truth: ALPAMobile/ALPAMobile.csproj — check it for current versions.
| Package | Version | Purpose |
|---|---|---|
| CommunityToolkit.Maui | 13.0.0 | Expander, other controls |
| CommunityToolkit.Mvvm | 8.4.0 | ObservableObject, WeakReferenceMessenger |
| Sentry.Maui | 6.0.0 | Crash reporting |
| Microsoft.Identity.Client | 4.69.1 | MSAL authentication |
| Microsoft.Azure.NotificationHubs | 4.2.0 | Push notifications |
| Plugin.Firebase.CloudMessaging | 3.1.2 | FCM (Android) |
| LiteDB | 5.0.21 | Document cache (with iOS workaround) |
| ZXing.Net.Maui.Controls | 0.7.3 | Barcode scanning |
| MAUI 9 | MAUI 10 | Impact |
|---|---|---|
FadeTo, RotateTo, ScaleTo, TranslateTo | …Async variants | High |
ListView | CollectionView | Critical |
TableView | CollectionView | Medium |
DisplayAlert | DisplayAlertAsync | Medium |
DisplayActionSheet | DisplayActionSheetAsync | Medium |
MessagingCenter | WeakReferenceMessenger | Medium |
Page.IsBusy | ActivityIndicator | Low |
FontImageExtension | FontImageSource | Low |
ClickGestureRecognizer | TapGestureRecognizer | Low |
LayoutOptions.*AndExpand usage should be migrated to Grid layouts (deferred, non-blocking)Device.GetNamedSize usage in XAML should migrate to explicit font sizes (deferred)Microsoft.Extensions.Caching.Memory 6.0.1 transitive dependency vulnerability — investigate update path| Document | Location |
|---|---|
| .NET 10 migration status (board) | Epic AB#1810 — .Net 10 |
| Development guide | development.html |
| Testing guide | testing.html |
| Crash investigation workflow | crash-investigation-workflow.html |