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.
Č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://YOUR_KEY@o0.ingest.sentry.io/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 vbin/Release/net10.0-ios/ios-arm64/ako.dSYMadresár. - Android: ProGuard/R8 mapping súbor
mapping.txtvbin/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.txtTento 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.
- 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.Mauialebo 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.CaptureMessagealebo Firebase Analytics. - Test crash button. Pred release-om v internej buildoch overte, že event reálne príde.
- Symbol upload do pipeline.
sentry-clistep v Github Actions podotnet publish. - Globálne handlery.
UnhandledExceptionaUnobservedTaskExceptionvApp.xaml.cs. - PII scrubbing.
BeforeSendcallback 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.




