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ť.

Xamarin.Forms → .NET MAUI Migrácia 2026

Aktualizované: 16. júna 2026

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net10.0-android;net10.0-ios</TargetFrameworks>
    <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">
      $(TargetFrameworks);net10.0-windows10.0.19041.0
    </TargetFrameworks>
    <OutputType>Exe</OutputType>
    <RootNamespace>MyApp</RootNamespace>
    <UseMaui>true</UseMaui>
    <SingleProject>true</SingleProject>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <ApplicationId>com.firma.myapp</ApplicationId>
    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
    <ApplicationVersion>1</ApplicationVersion>
    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-ios'))">15.0</SupportedOSPlatformVersion>
    <SupportedOSPlatformVersion Condition="$(TargetFramework.Contains('-android'))">24.0</SupportedOSPlatformVersion>
  </PropertyGroup>
</Project>

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 subore MauiProgram.cs
builder.ConfigureMauiHandlers(handlers =>
{
#if ANDROID
    Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping(
        "BorderColor",
        (handler, view) =>
        {
            handler.PlatformView.SetBackgroundColor(
                Android.Graphics.Color.Transparent);
            handler.PlatformView.SetPadding(20, 10, 20, 10);
        });
#endif
});

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žnicaMAUI ekvivalentStav v 2026
Xamarin.EssentialsMicrosoft.Maui.Essentials (vstavané)API takmer identické, namespace zmenený
Xamarin.CommunityToolkitCommunityToolkit.MauiAktívne udržiavané, niektoré controls premenované
MessagingCenterWeakReferenceMessenger (CommunityToolkit.Mvvm)Odporúčaný spôsob, MessagingCenter obsolete
Xamarin.Forms.MapsMicrosoft.Maui.Controls.MapsVyžaduje Google Maps API key explicitne
Plugin.MediaMediaPicker z .NET MAUI Essentials1:1 náhrada
SkiaSharp.Views.FormsSkiaSharp.Views.Maui.ControlsAktívne, identické API
Microsoft.AppCenter.*Sentry alebo Firebase CrashlyticsApp Center vypnutý 31.3.2025
Xamarin.AuthWebAuthenticator + MSAL.NETXamarin.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.

Inštalácia:

dotnet add package CommunityToolkit.Maui
dotnet add package CommunityToolkit.Mvvm

V `MauiProgram.cs`:

builder
    .UseMauiApp<App>()
    .UseMauiCommunityToolkit();

Krok 5: CI/CD po vypnutí App Center

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:

name: build-android
on: [push, pull_request]
jobs:
  build:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'
      - run: dotnet workload install maui-android
      - run: dotnet build -c Release -f net10.0-android
      - run: dotnet publish -c Release -f net10.0-android -p:AndroidPackageFormat=aab

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:

  1. 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.
  2. 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`.
  3. 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.
  4. Spoliehanie sa na compatibility renderers v produkcii. Kompatibilitný režim je tam, aby ste rozbehli build. Nie aby ste ho mali tri roky.
  5. Ž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í.

Pre detailnejší pohľad na novinky .NET MAUI 10 a deprekácie odporúčam aj sprievodcu .NET MAUI 10: novinky a vylepšenia pre rok 2026, kde sú detaily o Native AOT a XAML compiled bindings, ktoré sa oplatí zapnúť hneď po migrácii. Oficiálna referencia je v migračnej dokumentácii .NET MAUI od Microsoftu a v .NET MAUI roadmap na GitHube.

Často kladené otázky

Je Xamarin.Forms v roku 2026 ešte podporovaný?

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.

Priya Sharma
O Autorovi Priya Sharma

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.