Crash reporting v .NET MAUI 2026: Sentry, Firebase Crashlytics a život po App Center

App Center skončil. Praktický návod, ako nasadiť Sentry alebo Firebase Crashlytics v .NET MAUI 2026 - integrácia, upload symbolov, GDPR a check-list pre migráciu.

Crash reporting .NET MAUI 2026: Sentry vs Firebase

Aktualizované: 22. júna 2026

Crash reporting v .NET MAUI sa v roku 2026 robí cez Sentry alebo Firebase Crashlytics. Pôvodné Visual Studio App Center Microsoft oficiálne ukončil 31. marca 2025 a všetky jeho NuGet balíčky sú dnes bez podpory. Ak máte v produkčnej MAUI aplikácii ešte stále Microsoft.AppCenter.Crashes, nezachytávate žiadne pády od apríla 2025. Honestly, presne s týmto som narazil pri jednom klientovi, ktorému dashboard mesiace ukazoval „crash-free 100 %", kým prvá negatívna recenzia v Play Store neprezradila opak. V tomto sprievodcovi prejdem migráciu krok po kroku, integráciu oboch hlavných alternatív, upload symbolov pre iOS a Android, a check-list, ktorý vám zabráni stratiť ďalšie mesiace dát.

  • Visual Studio App Center bol vypnutý 31. marca 2025; všetky jeho SDK balíčky sú v stave end-of-life a nezbierajú dáta.
  • Sentry.Maui je oficiálny SDK od Sentry a v roku 2026 je najkratšia cesta k zachyteniu managed aj natívnych pádov.
  • Firebase Crashlytics funguje v MAUI cez Plugin.Firebase alebo natívne binding balíčky; je zadarmo aj pri vysokej záťaži.
  • Bez uploadu dSYM (iOS) a mapping súborov (Android R8/ProGuard) dostanete nečitateľné stack trace, aj keď SDK funguje.
  • Globálne handlery AppDomain.UnhandledException a TaskScheduler.UnobservedTaskException musíte registrovať explicitne, SDK ich sám nezavolá.
  • PII scrubbing nie je voliteľný: defaultné Sentry SendDefaultPii=true je v EÚ porušenie GDPR, ak ho neoverí právny tím.

Čo sa stalo s App Center a prečo to musíte riešiť teraz

Microsoft v roku 2024 oznámil, že Visual Studio App Center prejde do read-only režimu a 31. marca 2025 bude úplne vypnutý. Od tohto dátumu API odpovedá HTTP 404, dashboard je nedostupný a NuGet balíčky Microsoft.AppCenter, Microsoft.AppCenter.Analytics a Microsoft.AppCenter.Crashes sú označené ako deprecated. Väčšina tímov, s ktorými pracujem, mala App Center hlboko zabudovaný v Xamarin.Forms aplikáciách a po migrácii na .NET MAUI tieto závislosti len skopírovala do nového .csproj. Výsledok? SDK sa síce kompiluje, ale crash payloady končia v prázdne, pretože ingest endpoint už neexistuje.

Toto je klasický prípad „väčšina tímov túto časť preskočí, a potom". Sentinel hodnota pri pristúpení k metrike crash-free users je 100 %, čo na dashboardoch vyzerá ideálne. V skutočnosti aplikácia padá rovnako ako predtým, len o tom nikto nevie. Ak ste na MAUI prešli za posledných 18 mesiacov, prvá vec, ktorú by ste mali urobiť pred ďalším release-om, je grep -r "Microsoft.AppCenter" v repozitári. Ak niečo nájdete, naplánujte si na to sprint. Oficiálnu retirement nótu nájdete na Microsoft Learn — App Center retirement.

Výber nástroja: Sentry vs. Firebase Crashlytics vs. ostatné

V roku 2026 sú v ekosystéme .NET MAUI tri vážne kandidáti: Sentry, Firebase Crashlytics a Bugsnag. Raygun a Instabug sú menej rozšírené, ale stoja za zváženie pri špecifických use-case-och (Instabug má napríklad silné in-app feedback). Voľba závisí od toho, či už používate Firebase pre push notifikácie (vtedy je Crashlytics zadarmo bonus), či potrebujete distribuované tracing/performance metriky (Sentry to robí natívne), a od ceny pri vyššej event volume.

VlastnosťSentryFirebase CrashlyticsBugsnag
Oficiálny MAUI SDKÁno (Sentry.Maui)Cez plugin/bindingsCez plugin
Cena (free tier)5 000 events/mesiacZdarma neobmedzene7 500 events/mesiac
Natívne pády (iOS/Android)Áno, vrátane NDKÁnoÁno
Performance monitoringÁno (tracing)ObmedzenéÁno
Self-hostingÁno (open source)NieÁno (enterprise)
GDPR (EÚ región)Áno (Frankfurt)Nie pre CrashlyticsÁno (Dublin)
Hot reload friendlyÁnoVyžaduje reštartÁno

Pre väčšinu produkčných MAUI tímov, ktoré nezačínajú od nuly, je najmenej trecia cesta Sentry. Jeden NuGet balíček, jedna riadka v MauiProgram.cs, a podporuje Android, iOS, Windows aj MacCatalyst v rovnakom SDK. Firebase Crashlytics dáva zmysel, ak už máte Firebase projekt pre push notifikácie cez FCM v .NET MAUI a chcete unifikovaný dashboard pre Analytics, Crashlytics a Remote Config.

Integrácia Sentry.Maui krok po kroku

Sentry vydal oficiálny Sentry.Maui SDK v roku 2023 a v roku 2026 je vo verzii 5.x s plnou podporou .NET 9 a .NET 10. SDK zabaľuje Sentry core, Sentry.Maui integrácie pre lifecycle eventy, a Sentry.Extensions.Logging pre automatický breadcrumb logging z ILogger.

So, začnime inštaláciou balíčka:

dotnet add package Sentry.Maui --version 5.*

Potom v MauiProgram.cs pripojte Sentry do builder pipeline:

using Sentry.Maui;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .UseSentry(options =>
            {
                options.Dsn = "https://[email protected]/PROJECT_ID";
                // Vypnúť v Debug, aby ste nezahltili dashboard pri lokálnom dev
                options.Debug = false;
                options.Environment = AppInfo.Current.PackagingModel.ToString();
                options.Release = $"com.firma.app@{AppInfo.Current.VersionString}+{AppInfo.Current.BuildString}";
                // Sampling pre performance tracing, 10 % je rozumný štart
                options.TracesSampleRate = 0.1;
                // GDPR: nezbierať IP a user-agent automaticky
                options.SendDefaultPii = false;
                // Automatické zachytenie ActionExecuted, NavigationEvents, MAUI lifecycle
                options.IncludeTextInBreadcrumbs = false;
            });

        return builder.Build();
    }
}

DSN nikdy necommit-ujte do verejného repa. Uložte ho ako environment variable v CI a injektujte cez dotnet user-secrets alebo MSBuild EnvironmentVariables ItemGroup. Pre kontrolu, či Sentry zachytáva, pridajte testovacie tlačidlo, ktoré explicitne hodí výnimku:

private void OnTestCrashClicked(object sender, EventArgs e)
{
    SentrySdk.CaptureMessage("Test message from MAUI app", SentryLevel.Info);
    throw new InvalidOperationException("Test crash, bezpecne, len overujeme Sentry pipeline");
}

Po prvom páde sa udalosť objaví v Sentry dashboarde do 30 sekúnd. Detaily konfigurácie nájdete v oficiálnej Sentry .NET MAUI dokumentácii.

Firebase Crashlytics v .NET MAUI

Crashlytics nemá oficiálny Microsoft-supported SDK pre MAUI, ale komunitné balíčky Plugin.Firebase.Crashlytics a Plugin.Maui.Firebase obaľujú natívne Firebase iOS a Android SDK cez .NET bindings. V roku 2026 je najstabilnejšia cesta cez Plugin.Firebase od Sven-Michael Stube. Repo aj príklady sú na GitHub: Plugin.Firebase, ktorý je aktívne udržiavaný.

Postup je trochu náročnejší než pri Sentry. Musíte stiahnuť google-services.json (Android) a GoogleService-Info.plist (iOS) z Firebase konzoly, a pridať ich ako platform-specific resources. V Platforms/Android/MainActivity.cs alebo v MainApplication.cs zavolajte Firebase init:

protected override void OnCreate(Bundle? savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    CrossFirebase.Initialize(this);
    // Crashlytics sa automaticky pripojí na uncaught exception handler
}

Pre iOS v Platforms/iOS/AppDelegate.cs:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    CrossFirebase.Initialize(CrossFirebaseSettings.Current);
    return base.FinishedLaunching(app, options);
}

Pre manuálne nahlásenie výnimky, ktorú ste odchytili v try/catch:

try
{
    await _apiService.LoadUserDataAsync(userId);
}
catch (HttpRequestException ex)
{
    CrossFirebaseCrashlytics.Current.RecordException(ex);
    // Pokracujeme v graceful fallback
    ShowOfflineBanner();
}

Upload dSYM, PDB a mapping súborov

Toto je najčastejšia oblasť, kde sa ladia stack trace. Release build je optimalizovaný a obfuscovaný, takže bez symbolov dostanete v dashboarde niečo ako 0x18a3c2 + 0xc4 namiesto čitateľnej metódy. V mojom poslednom projekte sme týždeň naháňali „neidentifikovateľný" iOS pád, kým niekto zistil, že CI step na upload dSYM tichý padol s timeout-om. Pre každú platformu existuje iný formát:

  • iOS: dSYM bundle generovaný Xcode-om počas dotnet publish -f net10.0-ios -c Release. Nájdete ho v bin/Release/net10.0-ios/ios-arm64/ ako .dSYM adresár.
  • Android: ProGuard/R8 mapping súbor mapping.txt v bin/Release/net10.0-android/mapping/. Generuje sa len ak máte <AndroidLinkTool>r8</AndroidLinkTool> a <AndroidEnableProguard>true</AndroidEnableProguard>.
  • Windows/MacCatalyst: .NET PDB súbory generované automaticky pri publish s DebugType=portable.

Sentry má CLI nástroj, ktorý zjednoduší upload. Pridajte ho ako .NET tool:

dotnet tool install --global Sentry.Tool

# iOS dSYM upload (po kazdom Release builde)
sentry-cli debug-files upload \
  --org vasa-organizacia \
  --project mobile-app \
  bin/Release/net10.0-ios/ios-arm64/

# Android mapping upload (R8 musi byt zapnuty)
sentry-cli upload-proguard \
  --org vasa-organizacia \
  --project mobile-app \
  --android-manifest Platforms/Android/AndroidManifest.xml \
  bin/Release/net10.0-android/mapping/mapping.txt

Tento krok zaintegrujte do GitHub Actions pipeline ako post-build step. Ak ešte pipeline nemáte, prejdite si môj predchádzajúci článok CI/CD pre .NET MAUI v GitHub Actions, kde popisujem celý release workflow vrátane podpisovania.

Natívne pády vs. managed výnimky

Managed výnimky (System.NullReferenceException, HttpRequestException atď.) chytajú obidva SDK out-of-the-box. Natívne pády, segfault v native library, JNI crash na Androide, EXC_BAD_ACCESS na iOS, sú iný príbeh. Sentry ich rieši cez sentry-native, ktorý sa pribalí ako .so/.dylib do APK/IPA. Crashlytics má Firebase Crashlytics NDK pre Android natívne knižnice.

Najčastejší zdroj natívnych pádov v MAUI sú interop volania do natívneho kódu cez [DllImport] alebo handler-y, ktoré držia ukazovateľ na GC-ovaný objekt po jeho dealokácii. Na Androide to typicky vidíte ako SIGSEGV (signal 11) v libmonosgen-2.0.so. Bez upload-u symbolov pre natívne knižnice nedostanete použiteľný stack trace ani v jednom SDK. Týmto témam sa venujem aj v článku o optimalizácii výkonu .NET MAUI 10, kde rovnaké interop chyby ovplyvňujú aj štartovací čas.

Globálne handlery, ktoré SDK nezaregistruje za vás

Toto je footgun, ktorý si všimnete až keď vám príde Slack o tom, že produkcia padá a v dashboarde nemáte nič. Sentry.Maui registruje FirstChanceException a hook-uje sa do MAUI lifecycle, ale nezachytáva všetky výnimky, ktoré vyletia mimo MAUI dispatch loop-u. Konkrétne:

  • AppDomain.CurrentDomain.UnhandledException, výnimky z background threads, ktoré nikto neawaitoval.
  • TaskScheduler.UnobservedTaskException, fire-and-forget Task-y, ktoré hodili výnimku, ale nikto na ne nečakal.
  • AndroidEnvironment.UnhandledExceptionRaiser (len Android), natívne JNI handler.

Pridajte ich explicitne v App.xaml.cs konštruktore:

public App()
{
    InitializeComponent();

    AppDomain.CurrentDomain.UnhandledException += (s, e) =>
    {
        if (e.ExceptionObject is Exception ex)
            SentrySdk.CaptureException(ex);
        SentrySdk.FlushAsync(TimeSpan.FromSeconds(2)).GetAwaiter().GetResult();
    };

    TaskScheduler.UnobservedTaskException += (s, e) =>
    {
        SentrySdk.CaptureException(e.Exception);
        e.SetObserved();
    };

    MainPage = new AppShell();
}

Volanie FlushAsync pred terminate-om procesu je dôležité. Bez neho proces zomrie skôr, než stihne odoslať event na server. Pre Crashlytics existuje ekvivalent CrossFirebaseCrashlytics.Current.RecordException(ex) a Firebase si terminate flush rieši interne cez natívnu vrstvu.

GDPR, PII scrubbing a retencia

V EÚ je crash report osobný údaj v momente, keď obsahuje IP adresu, user ID alebo email. Sentry má default SendDefaultPii = false od verzie 4.0, ale staršie tutoriály toto nastavenie pretláčajú na true, aby ste videli kto pád zažil. Pri produkčnej aplikácii v EÚ to nesmiete urobiť bez explicit consent a záznamu v Records of Processing Activities.

Pre Sentry nastavte hosting v EÚ regióne (Frankfurt). DSN bude obsahovať .de.sentry.io namiesto .us.sentry.io. Pre Crashlytics tento výber neexistuje, dáta sú v US data center, a pre EÚ tímy je to často dealbreaker. Detaily o GDPR compliance pri crash reportingu sú v GDPR Article 32, ktorý definuje technical measures pre osobné dáta.

Doplňte scrubbing pre známe PII polia:

options.SetBeforeSend((evt, hint) =>
{
    // Odstranit email z user kontextu
    if (evt.User?.Email is not null)
        evt.User.Email = null;

    // Vymazat Authorization header z HTTP breadcrumbs
    foreach (var bc in evt.Breadcrumbs ?? Enumerable.Empty<Breadcrumb>())
    {
        if (bc.Data?.ContainsKey("Authorization") == true)
            bc.Data.Remove("Authorization");
    }
    return evt;
});

Migrácia z App Center: pre-flight check-list

Toto je playbook, ktorý používam pri migrácii klientov z App Center na Sentry alebo Crashlytics. Prejdite ho v poradí, preskočenie ktoréhokoľvek bodu sa vám vráti v produkcii.

  1. Audit závislostí. grep -r "Microsoft.AppCenter" . v celom solution. Označte všetky súbory.
  2. Odstránenie SDK. Vymažte Microsoft.AppCenter.* z .csproj. Skompilujte, error-y vám ukážu, kde sú API volania.
  3. Inštalácia nového SDK. dotnet add package Sentry.Maui alebo zodpovedajúci Firebase plugin.
  4. DSN/config do CI secrets. Nikdy nie do repo. GitHub Actions secrets.SENTRY_DSN.
  5. Náhrada API volaní. Crashes.TrackError(ex)SentrySdk.CaptureException(ex). Analytics.TrackEventSentrySdk.CaptureMessage alebo Firebase Analytics.
  6. Test crash button. Pred release-om v internej buildoch overte, že event reálne príde.
  7. Symbol upload do pipeline. sentry-cli step v Github Actions po dotnet publish.
  8. Globálne handlery. UnhandledException a UnobservedTaskException v App.xaml.cs.
  9. PII scrubbing. BeforeSend callback a kontrola, že DSN ide do EÚ regiónu.
  10. Alerting. Nastavte Sentry alert na crash-free users < 99.5 % alebo Crashlytics velocity alert.

Po splnení každého bodu nechajte aplikáciu beta-testovať aspoň 48 hodín na reálnych zariadeniach pred broad rollout-om. Ak po týždni dashboard ukazuje crash-free metriku 100 %, podozrievajte konfiguráciu. Žiadna produkčná aplikácia nemá nulový crash rate.

Často kladené otázky

Je App Center skutočne ukončený?

Áno. Microsoft Visual Studio App Center bol oficiálne vypnutý 31. marca 2025. API endpoint-y odpovedajú 404, dashboard je nedostupný a SDK balíčky Microsoft.AppCenter.* sú v stave deprecated. Akýkoľvek kód, ktorý ich stále používa, posiela dáta do prázdna.

Čo nahradí App Center pre .NET MAUI aplikácie?

Microsoft v retirement note odporúča Sentry, Firebase Crashlytics a Azure App Configuration pre rôzne funkcie pôvodného App Center. Pre crash reporting konkrétne sú v praxi najpoužívanejšie Sentry (oficiálny SDK pre MAUI) a Firebase Crashlytics (cez Plugin.Firebase).

Funguje Sentry s .NET MAUI?

Áno, Sentry vydáva oficiálny NuGet balíček Sentry.Maui, ktorý podporuje Android, iOS, MacCatalyst aj Windows v jednom SDK. Stačí jedno volanie builder.UseSentry(options => ...) v MauiProgram.cs a SDK automaticky zachytáva managed výnimky aj MAUI lifecycle breadcrumbs.

Ako pridám Firebase Crashlytics do .NET MAUI?

Nainštalujte komunitný balíček Plugin.Firebase, pridajte google-services.json do Platforms/Android ako GoogleServicesJson build action a GoogleService-Info.plist do Platforms/iOS ako BundleResource. Potom v MainActivity.OnCreate a AppDelegate.FinishedLaunching zavolajte CrossFirebase.Initialize(...).

Ako nahrať dSYM súbory do Sentry?

Použite Sentry CLI: sentry-cli debug-files upload --org <org> --project <proj> bin/Release/net10.0-ios/ios-arm64/. Tento krok musí bežať v CI po každom Release builde, inak budú iOS stack trace nečitateľné. Pre Android použite ekvivalentne sentry-cli upload-proguard s mapping.txt súborom.

Je Sentry zadarmo pre malé MAUI projekty?

Áno, Sentry má free tier 5 000 events mesačne a 50 MB attachment-ov. Pre väčšinu indie MAUI aplikácií s pod 10 000 MAU to bohato stačí. Pri prekročení sa platí podľa event volume, alebo môžete self-hostovať open-source verziu zdarma.

Sofia Rodriguez
O Autorovi Sofia Rodriguez

Mobile DevOps engineer focused on the unglamorous stuff: build pipelines, signing, store releases, and the tooling that keeps teams shipping.