MAUI nutzt das .NET-SDK, das auf netstandard2.0 zielt und dasselbe Paket ist, das eine WPF-, WinForms-, Avalonia- oder Konsolenanwendung verwenden würde; siehe eine App messen dazu, was es meldet. MAUI-spezifisch ist, wo Sie es starten, wo Sie seine Warteschlange ablegen und wie Bildschirme zu ihren Namen kommen.

Der Quelltext und eine Demo-Desktop-App, die sich selbst meldet, liegen unter skomi-sdk-dotnet.

Ein Client, für die Lebensdauer der App

Registrieren Sie ihn in MauiProgram.cs, damit die App genau einen hat:

builder.Services.AddSingleton(_ => new SkomiClient(new SkomiOptions
{
    AppId = Guid.Parse("your-app-id"),          // aus My Apps in Skomi
    AppVersion = AppInfo.Current.VersionString,
    StoragePath = FileSystem.Current.AppDataDirectory,
}));

AppVersion fällt auf die Version der Einstiegsassembly zurück, und die ist bei MAUI nicht die Version, die Sie an einen Store ausgeliefert haben. AppInfo.Current.VersionString ist es.

StoragePath entscheidet, wo die Offline-Warteschlange liegt. FileSystem.Current.AppDataDirectory ist auf jedem MAUI-Ziel app-privat und übersteht eine Aktualisierung, was der voreingestellte Pfad für lokale Anwendungsdaten auf Mobilgeräten nicht verlässlich tut.

Entsorgen Sie ihn beim Beenden. Das hält den Zeitgeber an und unternimmt einen letzten begrenzten Zustellversuch; was jetzt nicht geht, liegt auf der Platte und geht beim nächsten Lauf. Haben Sie ihn als Singleton registriert, entsorgt der DI-Container ihn beim Herunterfahren des Hosts für Sie, aber eine MAUI-App wird oft abgeschossen statt heruntergefahren, und genau deshalb gibt es die Warteschlange.

Benennen Sie Ihre Bildschirme

skomi.Screen("checkout/review", new Dictionary<string, object?> { ["tier"] = "gold" });

Es gibt keine automatische Erfassung von Seitennamen: eine Seitenklasse ist das, was Ihr Code einen Bildschirm nennt, nicht das, was Sie in einem Bericht so nennen würden. Die natürliche Stelle in MAUI ist ein Handler an der Navigation:

Shell.Current.Navigated += (_, e) =>
    skomi.Screen(e.Current.Location.OriginalString.Trim('/'));

Das ist ein Ausgangspunkt und keine Regel: Routenzeichenketten ergeben nur dann lesbare Namen, wenn Ihre Routen lesbar sind.

Fehler

try
{
    await CheckoutAsync();
}
catch (Exception ex)
{
    skomi.CaptureError(ex, fatal: false, screenName: "checkout/review");
    ShowRetry();
}

Fehler werden nach Typ gruppiert statt nach Meldung, weil eine Meldung Kennungen und Beträge trägt, die jedes Vorkommen einzigartig machen.

Das ist kein Absturzmelder. Es hält die Fehler fest, die Sie ihm geben, und die verwalteten Ausnahmen, die es sehen kann; ein nativer Absturz auf Android oder iOS nimmt den Prozess mit, bevor irgendetwas geschrieben werden kann. Behalten Sie dafür die Meldung des Stores oder Crashlytics oder Sentry; was Skomi hinzufügt, ist eine absturzfreie Rate neben Ihren Versionszahlen und die Fehler, die Sie zu melden gewählt haben.

Es gibt außerdem keinen Upload von Mapping-Dateien, eine Stapelspur aus einem minimierten Release-Build kommt also so an, wie sie geworfen wurde.

Es wirft nie in Ihren Code

Jede öffentliche Methode schluckt und meldet über OnError, das standardmäßig still ist, richtig für eine ausgelieferte App und falsch, solange Sie integrieren:

OnError = (ex, stage) => Debug.WriteLine($"Skomi {stage}: {ex}"),

Auf die Einwilligung warten

new SkomiOptions { AppId = id, Enabled = false }

Enabled = false hält nichts fest und sendet nichts, ein Client kann also ab dem Start existieren und erst zu erheben beginnen, wenn jemand zugestimmt hat.

Prüfen, ob es funktioniert

Starten Sie die App, wechseln Sie zwischen zwei Seiten und sehen Sie in Ihr Dashboard. Wenn nichts ankommt, setzen Sie zuerst OnError: eine App-ID aus der falschen App und ein Client, der nie entsorgt wurde, sind die beiden üblichen Ursachen, und beide sind ohne das still.