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 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ť
Sentry
Firebase Crashlytics
Bugsnag
Oficiálny MAUI SDK
Áno (Sentry.Maui)
Cez plugin/bindings
Cez plugin
Cena (free tier)
5 000 events/mesiac
Zdarma neobmedzene
7 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
Áno
Vyž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");
}
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
}
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:
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.
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.
Audit závislostí.grep -r "Microsoft.AppCenter" . v celom solution. Označte všetky súbory.
Odstránenie SDK. Vymažte Microsoft.AppCenter.* z .csproj. Skompilujte, error-y vám ukážu, kde sú API volania.
Inštalácia nového SDK.dotnet add package Sentry.Maui alebo zodpovedajúci Firebase plugin.
DSN/config do CI secrets. Nikdy nie do repo. GitHub Actions secrets.SENTRY_DSN.
Náhrada API volaní.Crashes.TrackError(ex) → SentrySdk.CaptureException(ex). Analytics.TrackEvent → SentrySdk.CaptureMessage alebo Firebase Analytics.
Test crash button. Pred release-om v internej buildoch overte, že event reálne príde.
Symbol upload do pipeline.sentry-cli step v Github Actions po dotnet publish.
Globálne handlery.UnhandledException a UnobservedTaskException v App.xaml.cs.
PII scrubbing.BeforeSend callback a kontrola, že DSN ide do EÚ regiónu.
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.
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.