Міграція мобільного застосунку з Xamarin на .NET MAUI
Microsoft припинила підтримку Xamarin.iOS та Xamarin.Android у травні 2024. Xamarin.Forms отримала extended support до кінця 2024 року. Це означає: немає оновлень безпеки, немає підтримки нових версій iOS та Android SDK, немає виправлення багів. Застосунок на Xamarin — це накопичуючийся технічний борг з конкретною датою завершення.
.NET MAUI — офіційний наступник Xamarin.Forms. Архітектурно це еволюція, а не революція. Але «просто оновити NuGet-пакети» не вийде.
Що ломається при міграції
Структура проекту. У Xamarin.Forms три проекти: спільний PCL/Shared + iOS head project + Android head project. У MAUI — єдиний multi-target проект: один .csproj з <TargetFrameworks>net8.0-ios;net8.0-android</TargetFrameworks>. Нативні ресурси (іконки, шрифти, Assets) переносяться в Resources/ у корені єдиного проекту. Вся структура AppDelegate.cs, MainActivity.cs пересобирається.
Namespace-и та API. Xamarin.Forms → Microsoft.Maui. Це стосується кожного using-а в проекті. Частина класів переименована: Device.BeginInvokeOnMainThread → MainThread.BeginInvokeOnMainThread, Application.Current.MainPage → Application.Current?.Windows[0].Page. Renderers замінені на Handlers — принципово інша модель кастомізації нативних контролів.
Renderers → Handlers. Це найбільш болісне. У Xamarin.Forms кастомний рендерер для Entry — це клас, що наслідує EntryRenderer, переопеределяє OnElementChanged. У MAUI Handler — це маппінг властивостей через PropertyMapper та CommandMapper. Кожен кастомний рендерер потрібно переписати. Якщо в проекті 5–10 кастомних рендереорів — це серйозний обсяг роботи.
Залежності та плагіни. Деякі Xamarin-плагіни (особливо з Xamarin.Essentials, який тепер вбудований у MAUI) просто зникли або були переименовані. Сторонні плагіни — перевіряємо на NuGet сумісність з net8.0-ios / net8.0-android. Плагіни, які не оновилися до MAUI, потрібно замінювати альтернативами або писати свої.
Як проводимо міграцію
Аудит залежностей — перший та найважливіший крок. Збираємо повний список NuGet-пакетів, перевіряємо кожен на MAUI-сумісність. Для Xamarin.Essentials залежностей — хороша новина: більшість API вбудовано в MAUI нативно. Для кастомних рендереорів складаємо список з оцінкою трудомісткості переписування на Handlers.
Upgrade Assistant. Microsoft випустила dotnet-maui-check та .NET Upgrade Assistant з підтримкою Xamarin → MAUI. Інструмент робить частину механічної роботи: обновляє .csproj, змінює target frameworks, переносить ресурси. Але це ~30–40% роботи. Решта — ручна правка.
Shell navigation. Якщо проект використовував Xamarin.Forms Shell — це хороша новина: MAUI Shell сумісний концептуально. AppShell.xaml з <TabBar>, <FlyoutItem>, route-реєстрація через Routing.RegisterRoute — переїжджає з мінімальними змінами.
Dependency Injection. У Xamarin.Forms DI не був вбудований — використовували Autofac, DryIoc, TinyIoC. MAUI має вбудований MauiAppBuilder з Microsoft.Extensions.DependencyInjection. Це стандартний .NET DI, добре знайомий розробникам ASP.NET. Реєстрація сервісів переносяться в MauiProgram.cs.
Тестування. MAUI підтримує xUnit та NUnit для unit-тестів. Для UI-тестування — Appium з dotnet-appium-driver або MAUI UI Testing-сумісні підходи. Покриття бізнес-логіки тестами до міграції — страховка від регресій.
Після міграції обов'язкові: ручне тестування на фізичних пристроях iOS та Android (емулятора недостатньо для перевірки нативної поведінки), прогон через TestFlight та Firebase App Distribution до релізу.
Терміни
| Розмір проекту | Кастомні рендереры | Ориєнтир |
|---|---|---|
| До 20 екранів | Немає / 1–3 | 3–5 тижнів |
| 20–50 екранів | 3–10 | 6–10 тижнів |
| 50+ екранів | 10+ | 12+ тижнів |
Вартість розраховується після аудиту проекту: аналізу .csproj, списку NuGet-залежностей та кількості кастомних рендереорів.







