Migrácia z Xamarin.Forms na .NET MAUI: Praktický sprievodca pre tímy v roku 2026
Praktický sprievodca migráciou z Xamarin.Forms na .NET MAUI 10 v roku 2026: čo auditovať, ako prepísať Renderers na Handlers, kam presunúť CI/CD po App Center a koľko času reálne plánovať.
Migrácia z Xamarin.Forms na .NET MAUI je dnes pre väčšinu tímov skôr nutnosť než voľba. Oficiálna podpora Xamarinu skončila 1. mája 2024 a od vydania .NET MAUI 10 v novembri 2025 ide o jediný podporovaný spôsob, ako udržať existujúce mobilné aplikácie na novších verziách iOS a Android. V tomto sprievodcovi vás prevediem celým procesom tak, ako sme ho zvládli v našom tíme: od počiatočného auditu cez SDK-style csproj, výmenu Renderers za Handlers, až po stabilizáciu CI/CD a prvé produkčné nasadenie. (Áno, šli sme do toho s rezervou na hotfixy, a aj tak nás pár vecí prekvapilo.)
Xamarin.Forms je od 1. mája 2024 mimo podpory; migrácia na .NET MAUI 10 (LTS, podpora do novembra 2028) je odporúčaná cesta.
Migráciu robte na vetve a po malých krokoch: najprv .NET 6, potom .NET 8, až nakoniec .NET 10 a Native AOT.
.NET Upgrade Assistant (try-convert) zvládne csproj a väčšinu balíčkov, ale Custom Renderers a efekty si vždy budete prepisovať ručne na Handlers.
Najčastejšie regresie sa objavujú v CollectionView, Shell navigácii a v custom fontoch, počítajte s 2–3 sprintami QA aj pri menšej aplikácii.
Plánujte minimálne Android API 24 a iOS 15.0; staršie cieľové verzie .NET MAUI 10 nepodporuje.
App Center bol vypnutý 31. marca 2025, takže CI/CD a crash reporting si treba presunúť na GitHub Actions, Azure DevOps a Sentry alebo Firebase Crashlytics.
Prečo migrovať z Xamarin.Forms na .NET MAUI v roku 2026
Pre väčšinu tímov, s ktorými spolupracujem, už nejde o otázku „či“ migrovať, ale „ako rýchlo“. Xamarin.Forms je oficiálne mimo podpory od 1. mája 2024 a Microsoft jednoznačne deklaroval, že žiadne kritické bezpečnostné záplaty pre Xamarin.iOS ani Xamarin.Android už nevychádzajú. V praxi to znamená, že každá nová verzia iOS alebo Android, ktorá vyžaduje novšie SDK (typicky kvôli Google Play target API pravidlu), bude pre Xamarin aplikácie čoraz bolestivejšia.
.NET MAUI 10, ktorý vyšiel 11. novembra 2025 ako verzia s dlhodobou podporou (LTS) do novembra 2028, prináša tri zásadné dôvody, prečo sa migrácia oplatí teraz a nie o pol roka:
Stabilita. Cyklus chýb v CollectionView a Shell, ktorý nás trápil v MAUI 7 a 8, je v MAUI 10 v podstate uzavretý. Vidíme menej regresií medzi servisnými vydaniami.
Výkon. Native AOT pre iOS znižuje studený štart v reálnych aplikáciách o 30–45 % oproti Xamarinu. Detaily som rozpísal v článku optimalizácia výkonu .NET MAUI.
Tooling. Hot Reload, XAML hot reload pre Visual Studio Code a podpora pre `dotnet workload` urobili z developer experience niečo, čo Xamarin nikdy nemal.
Z manažérskeho pohľadu argumentujem jednoducho: každý mesiac, počas ktorého ostávate na Xamarine, je technický dlh, ktorý vám nakoniec vystaví účet za rušné. A tým rušným je obvykle prvá kritická CVE, ktorú vám už nikto nezáplatuje.
Audit projektu pred migráciou: čo zistiť za prvý týždeň
Najhoršia vec, ktorú som videl tímy urobiť, je spustiť .NET Upgrade Assistant v pondelok ráno bez auditu. Skončia v stredu pri 240 chybách kompilácie a stratia týždeň hľadaním, čo vlastne odkiaľ pochádza. Honestly, zažil som to aj sám pri prvom pokuse pred dvomi rokmi. Skôr ako sa dotknete jediného súboru, urobte si štruktúrovaný prehľad:
Inventár NuGet balíčkov. Vyexportujte si všetky `PackageReference` a `Reference` z oboch projektov (iOS aj Android) a pre každý si poznačte: má MAUI verziu? existuje fork? je aktívne udržiavaný v roku 2026? Pre balíčky bez náhrady budete potrebovať buď náhradné riešenie, alebo dočasný Xamarin shim cez `ms-build` linker tricks.
Mapa Custom Renderers a Effects. `grep -r "CustomRenderer\|PlatformEffect" Platforms/` vám dá presný počet. Každý jeden z nich budete prepisovať ručne, odhadujte 2–6 hodín na renderer podľa zložitosti.
Behaviors a MessagingCenter. `MessagingCenter` je v .NET MAUI označený ako obsolete. Náhrada je `WeakReferenceMessenger` z CommunityToolkit.Mvvm, ale API je odlišné, takže počítajte s mechanickou prerábkou každého `Subscribe` a `Send` volania.
Target framework verzie. Skontrolujte minimálne iOS a Android verzie. .NET MAUI 10 vyžaduje Android API 24 (Android 7.0) a iOS 15.0 ako minimum. Ak podporujete nižšie, treba o tom s produktovým tímom hovoriť pred migráciou.
Resource files. `Resources/Images`, fonty, lokalizačné `.resx` súbory. V MAUI sa všetko zlučuje do `Resources/` v jednom projekte a obrázky idú cez `MauiImage` build action. Naplánujte si presun.
Tento audit je v podstate váš risk register pre migráciu. U nás trval dvom seniorom 3 dni a ušetril minimálne dva týždne neskôr.
Krok 1: SDK-style csproj a .NET Upgrade Assistant
Praktická časť začína premenou starého „packages.config + .csproj“ formátu na moderný SDK-style csproj. Tu pomáha .NET Upgrade Assistant, ktorý funguje aj ako Visual Studio rozšírenie, aj ako CLI nástroj.
Inštalácia a spustenie:
dotnet tool install -g upgrade-assistant
cd /cesta/k/solution
upgrade-assistant upgrade MyApp.sln
Nástroj prejde projektmi v správnom poradí (zdieľaný kód, platformy, hlavná aplikácia), navrhne TFM (target framework moniker) ako `net10.0-android` a `net10.0-ios` a spojí všetko do jedného multi-target projektu. Toto je najväčšia mentálna zmena oproti Xamarinu: namiesto troch projektov (Shared, iOS, Android) máte jeden projekt s viacerými TFM a špeciálnym priečinkom `Platforms/`.
Po dokončení assistanta dostanete csproj, ktorý vyzerá približne takto:
Krok, ktorý Upgrade Assistant neurobí (a často to tímom uniká), je transformácia `App.xaml.cs` a vytvorenie `MauiProgram.cs`. V Xamarine ste mali `FormsApplicationDelegate` na iOS a `MainActivity : FormsAppCompatActivity` na Androide. V MAUI je všetko centralizované cez `MauiAppBuilder`:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// DI registracie, vid clanok o MVVM a DI nizsie
builder.Services.AddSingleton<IApiClient, ApiClient>();
builder.Services.AddTransient<MainViewModel>();
builder.Services.AddTransient<MainPage>();
return builder.Build();
}
}
Ak nemáte DI z Xamarinu (väčšina tímov používala buď Xamarin.Forms.DependencyService, alebo manuálne factory), je čas to zaviesť teraz. Detaily k DI a CommunityToolkit som rozpísal v sprievodcovi MVVM architektúra v .NET MAUI.
Krok 2: Z Custom Renderers na .NET MAUI Handlers
Custom Renderers sú najväčšia mentálna zmena pri migrácii. V Xamarin.Forms ste mali pre každú platformu separátny renderer, ktorý dedil z `ViewRenderer`. V .NET MAUI Microsoft zaviedol architektúru Handlers, ktorá je jednoduchšia, výkonnejšia a má menej alokácií.
Dobrá správa: .NET MAUI obsahuje vstavanú compatibility layer, ktorá vie existujúci Xamarin Renderer spustiť (po menších úpravách namespace) bez prepisu. Zlá správa: ide o dočasné riešenie, ktoré sa neodporúča pre produkciu a v MAUI 11 (plánovaný november 2026) sa očakáva, že kompatibilitný režim bude označený ako obsolete.
V krátkodobom horizonte: použite kompatibilitu, aby ste rozbehli build. V strednodobom (do 6 mesiacov od migrácie): prepíšte všetko na Handlers. Príklad jednoduchého handlera, ktorý nastavuje hraničnú farbu Entry na Androide:
Všimnite si, že nepíšete celú novú triedu, len pridávate správanie do existujúceho mappera. Toto je obrovský posun: 80 % renderov, ktoré sme mali v Xamarine, sa v MAUI dá vyjadriť ako 5–15 riadkov v mapper extension namiesto 200 riadkov v samostatnej renderer triede. (Pri jednom z našich projektov sme tým zmazali skoro 1 200 riadkov balastu.)
Krok 3: Shell navigácia, CollectionView a resource dictionaries
Ak vaša Xamarin aplikácia používala `MasterDetailPage`, `TabbedPage` alebo `CarouselPage` priamo, migrácia je relatívne priamočiara, všetko funguje podobne aj v MAUI. Ak ste však už používali Xamarin.Forms Shell, máte šťastie: MAUI Shell je takmer 1:1 kompatibilný, s pár zlepšeniami (najmä spoľahlivejšia `Shell.Navigation` a podpora pre query parametre v deep linkoch).
So, pozor na tieto tri konkrétne regresie, ktoré sme spravidla videli pri prvom builde po migrácii:
ListView → CollectionView. `ListView` v MAUI existuje, ale je oficiálne odporúčané prejsť na `CollectionView`. `ItemTemplate` je 100 % kompatibilný, ale `ItemsSource` virtualizácia funguje inak. Ak ste mali custom `ListView.RowHeight` logiku, prepíšte ju na `ItemSizingStrategy="MeasureFirstItem"`.
Resource Dictionaries. V Xamarine ste mohli mať `App.xaml` s globálnymi resources. V MAUI funguje rovnako, ale `OnPlatform` a `OnIdiom` markup extensions majú prísnejší typový systém. Ak vám build hlasí „cannot convert from X to Y“, je to skoro vždy tu.
Fonty. V Xamarine ste registrovali fonty cez `Assets/` na Androide a Info.plist na iOS. V MAUI to robíte centrálne v `MauiProgram.cs` cez `ConfigureFonts`. Po migrácii skontrolujte, či sa všade používa `FontFamily="OpenSansRegular"` (alias z `AddFont`) a nie cesta k súboru.
Toto je často najčasovo náročnejšia časť migrácie, pretože regresie v UI zachytí len QA. Kompilátor vám nepovie, že tlačidlo je teraz o 4 px nižšie. Plánujte vizuálnu regresnú batériu na všetkých kľúčových obrazovkách.
Krok 4: Knižnice tretích strán a CommunityToolkit.Maui
Zoznam knižníc, ktoré máte typicky v Xamarine a ich MAUI ekvivalenty v roku 2026:
Xamarin knižnica
MAUI ekvivalent
Stav v 2026
Xamarin.Essentials
Microsoft.Maui.Essentials (vstavané)
API takmer identické, namespace zmenený
Xamarin.CommunityToolkit
CommunityToolkit.Maui
Aktívne udržiavané, niektoré controls premenované
MessagingCenter
WeakReferenceMessenger (CommunityToolkit.Mvvm)
Odporúčaný spôsob, MessagingCenter obsolete
Xamarin.Forms.Maps
Microsoft.Maui.Controls.Maps
Vyžaduje Google Maps API key explicitne
Plugin.Media
MediaPicker z .NET MAUI Essentials
1:1 náhrada
SkiaSharp.Views.Forms
SkiaSharp.Views.Maui.Controls
Aktívne, identické API
Microsoft.AppCenter.*
Sentry alebo Firebase Crashlytics
App Center vypnutý 31.3.2025
Xamarin.Auth
WebAuthenticator + MSAL.NET
Xamarin.Auth bez náhrady, treba prepísať
CommunityToolkit.Maui si zaslúži zvláštnu pozornosť. Je to de facto štandardná rozšírovacia knižnica pre MAUI a obsahuje veci, ktoré vám v Xamarine často chýbali: `Popup`, `SnackBar`, `Behaviors` ako `EventToCommandBehavior`, a Converters. V našom tíme je `CommunityToolkit.Maui` aj `CommunityToolkit.Mvvm` automatickou súčasťou každého nového projektu. Pre prácu s lokálnym úložiskom následne odporúčam sprievodcu lokálna databáza v .NET MAUI s SQLite, ktorý dobre dopĺňa MVVM vrstvu z toolkitu.
Visual Studio App Center, ktorý bol dlhé roky štandardom pre Xamarin tímy, bol oficiálne vypnutý 31. marca 2025. Ak ešte stále máte vo svojej pipeline kroky, ktoré ukazujú na App Center API, tak vám build buď padá, alebo ticho zlyhávajú nasadenia.
V roku 2026 sú tri rozumné cesty pre CI/CD .NET MAUI aplikácie:
GitHub Actions s self-hosted runnermi pre iOS build (kvôli macOS), alebo `macos-15` runner. Funguje dobre pre open source aj komerčné projekty.
Azure DevOps Pipelines, najprirodzenejšie pre enterprise tímy, ktoré už používajú Azure. Microsoft poskytuje hosted macOS agentov a má prebuilt task pre `dotnet workload install maui`.
Codemagic alebo Bitrise, komerčné riešenia, ktoré majú prednostne nakonfigurované MAUI workflow šablóny a sú lacnejšie na škálovanie ako vlastné macOS hardvér.
Príklad GitHub Actions workflow pre Android build:
Pre crash reporting sme prešli na Sentry (jeho .NET MAUI SDK je výborný a zachytí managed aj natívne crashes). Firebase Crashlytics je tiež možnosť, ale vyžaduje viac konfigurácie cez Gradle a Cocoapods.
Najčastejšie chyby a ako sa im vyhnúť
Po desiatkach migračných projektov, ktoré som videl v posledných troch rokoch, sú toto vzorce, ktoré sa opakujú a stoja tímy najviac času:
Pokus migrovať priamo z Xamarin.Forms 4.x na MAUI. Ak máte staršie verzie Xamarinu, najprv ich aktualizujte na Xamarin.Forms 5.0.0.2622 (posledná oficiálna verzia). Bez toho budete bojovať s naraz dvoma kategóriami chýb.
Zachovanie pôvodného mena Assembly a namespace. Niektoré tímy z hrdosti odmietajú zmeniť namespace z `MyCompany.MyApp.Forms` na čisté `MyCompany.MyApp`. Výsledok: refactor je dvakrát ťažší, pretože musíte všade aktualizovať `xmlns:local`.
Migrácia celej UI „na zelenú lúku“. Často počujem „už keď migrujeme, tak prerobme aj UI“. Nerobte to. Migrujte funkčne identickú aplikáciu, vydajte produkčnú verziu, až potom otvorte priestor na UI prácu. Inak nedokážete oddeliť regresie z migrácie od chýb v novom dizajne.
Spoliehanie sa na compatibility renderers v produkcii. Kompatibilitný režim je tam, aby ste rozbehli build. Nie aby ste ho mali tri roky.
Žiadne unit testy pred migráciou. Ak máte business logiku v ViewModeloch a tie nie sú kryté testami, migrácia ich pravdepodobne nezlomí, ale aj keby zlomila, nezistíte to. Aspoň najkritickejšie ViewModely si pred migráciou pokryte.
Ako dlho migrácia z Xamarin.Forms na .NET MAUI trvá?
Toto je najčastejšia otázka, ktorú dostávam od manažérov, a poctivá odpoveď je „závisí“. Ale dám vám rámec, ktorý nám funguje na odhady:
Malá aplikácia (do 20 obrazoviek, žiadne custom rendere, štandardné NuGet balíčky): 3–5 sprintov (6–10 týždňov) pre dvoch developerov, vrátane QA a produkčného nasadenia.
Stredná aplikácia (20–50 obrazoviek, 5–15 custom renderov, vlastný auth, push notifikácie): 5–8 sprintov (10–16 týždňov) pre tím 2–3 ľudí.
Veľká aplikácia (50+ obrazoviek, MasterDetail navigácia, viac modulov, integrácie s natívnymi SDK): 4–6 mesiacov realistického plánovania, často s prechodom cez .NET 8 ako medzistupeň.
Najmenej polovica z toho času nie je kódovanie. Je to QA, regresia, hotfixy v staging, dohadovanie s produktovým tímom o tom, ktoré vizuálne nuansy treba prinavrátiť. Plánujte podľa toho a nesľubujte CEO „bude to za mesiac“. Skúsenosť hovorí, že tímy, ktoré dali migrácii poctivý časový priestor, ju zvládli bez ovplyvnenia produktovej roadmapy. Tímy, ktoré sa snažili „popri tom“, sa s ňou ťahali rok a pol.
Checklist pred merge do main vetvy
Pred tým, ako migrovaný projekt mergnete do hlavnej vetvy a začnete produkčné nasadenie, prejdite si s tímom túto kontrolu:
Build prechádza pre `net10.0-android` aj `net10.0-ios` lokálne aj v CI.
Žiadne `Microsoft.Maui.Controls.Compatibility` namespace v produkčnom kóde (alebo máte ticket na ich odstránenie do X týždňov).
Crash reporting (Sentry/Crashlytics) je nainštalovaný a otestovaný úmyselným pádom v staging buildu.
App Center alebo Xamarin-špecifické URL sú odstránené z CI konfigu a `Info.plist` a `AndroidManifest.xml`.
Vizuálna regresia na top 10 obrazoviek prešla QA na minimálne dvoch zariadeniach na platformu.
Bundle size kontrola: MAUI aplikácia by mala byť porovnateľná alebo menšia ako Xamarin, ak nie, niečo nesedí.
Nie. Oficiálna podpora Xamarin.Forms aj Xamarin.iOS a Xamarin.Android skončila 1. mája 2024. Microsoft nevydáva žiadne ďalšie záplaty ani opravy chýb a odporúča migráciu na .NET MAUI.
Môžem ponechať Xamarin Custom Renderer v .NET MAUI projekte?
Áno, dočasne. .NET MAUI obsahuje compatibility layer `Microsoft.Maui.Controls.Compatibility`, ktorý vie spustiť pôvodný Renderer s minimálnymi úpravami. Nie je to však odporúčané pre dlhodobé použitie. Naplánujte prechod na Handlers do 6 mesiacov.
Aký je rozdiel medzi Renderer a Handler v .NET MAUI?
Renderer (Xamarin) bola samostatná trieda dediaca z `ViewRenderer<T,U>`, ktorá obaľovala natívny control. Handler (MAUI) je odľahčená architektúra s `Mapper` slovníkom, kde každú vlastnosť mapujete na natívne API. Handlers majú menej alokácií a sú výkonnejšie pri renderingu zoznamov.
Treba pri migrácii prejsť cez .NET 8 alebo môžem rovno na .NET 10?
Pre väčšie projekty (50+ obrazoviek) odporúčam medzikrok cez .NET 8 LTS, aby ste mali stabilný bod, ku ktorému sa môžete vrátiť. Pre menšie aplikácie je rozumné prejsť rovno na .NET 10, ktorý je tiež LTS s podporou do novembra 2028.
Čo nahradí App Center pre crash reporting v .NET MAUI?
Najčastejšie voľby v roku 2026 sú Sentry (má prvotriedny .NET MAUI SDK a zachytí managed aj natívne crashes) alebo Firebase Crashlytics. Pre CI/CD nasadenie sa App Center nahrádza GitHub Actions, Azure DevOps Pipelines alebo Codemagic.
Bude moja aplikácia po migrácii rýchlejšia?
Áno, vo väčšine prípadov. .NET MAUI 10 s Native AOT na iOS znižuje studený štart o 30–45 % oproti Xamarinu a využíva menej pamäte vďaka jednoduchšej Handler architektúre. Reálne zlepšenie závisí od veľkosti aplikácie a počtu custom kontrolov.
Cross-platform engineering lead who's shipped apps to millions on both Play Store and App Store. Believes shared codebases shouldn't mean shared mediocrity.
Praktický návod, ako v .NET MAUI 10 spojazdniť App Links na Androide a Universal Links na iOS — od overovacích súborov cez Shell routing až po lokálne testovanie.
Hot Reload v .NET MAUI 10 prestal fungovať? Prejdite si presné príčiny rude edits, iOS interpreter setup, multi-target footguny a šesťkrokový diagnostický checklist pre rok 2026.