Passen Sie Ihre Firebase Crashlytics-Absturzberichte an

In dieser Anleitung wird beschrieben, wie Sie Ihre Absturzberichte mit dem Firebase Crashlytics SDK anpassen. Standardmäßig sammelt Crashlytics automatisch Absturzberichte für alle App-Benutzer (Sie automatischen Crash - Meldung deaktivieren können und ermöglichen Opt-in - Reporting stattdessen für die Benutzer). Crashlytics bietet vier Logging Mechanismen aus der Box: benutzerdefinierte Schlüssel , kundenspezifische Protokolle , Benutzerkennungen und gefangen Ausnahmen .

Benutzerdefinierte Schlüssel hinzufügen

Benutzerdefinierte Schlüssel helfen Ihnen, den spezifischen Status Ihrer App zu ermitteln, der zu einem Absturz geführt hat. Sie können Ihren Absturzberichten beliebige Schlüssel/Wert-Paare zuordnen und dann die benutzerdefinierten Schlüssel verwenden, um Absturzberichte in der Firebase-Konsole zu suchen und zu filtern.

  • Im Crashlytics Armaturenbrett können Sie nach Themen suchen , die einen benutzerdefinierten Schlüssel entsprechen.
  • Wenn Sie ein bestimmtes Problem in der Konsole überprüft, können Sie den zugehörigen benutzerdefinierten Schlüssel für jedes Ereignis (Keys Subreiter) anzeigen und auch die Ereignisse von benutzerdefinierten Tasten (Filter - Menü oben auf der Seite) filtert.

Verwenden Sie die setCustomValue Methode Satz Schlüssel / Wert - Paare. Beispielsweise:

Schnell

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

Ziel c

Wenn ganze Zahlen, Boolesche Werte oder Schwimmer Einstellung Feld den Wert als @( value ) .

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

Sie können den Wert eines vorhandenen Schlüssels auch ändern, indem Sie den Schlüssel aufrufen und auf einen anderen Wert setzen. Beispielsweise:

Schnell

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

Ziel c

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

Hinzufügen Schlüssel / Wert - Paare in der Masse durch Verwendung der setCustomKeysAndValues Methode mit einem NSDictionary als einzigen Parameter:

Schnell

let keysAndValues = [
               "string key" : "string value",
               "string key 2" : "string value 2",
               "boolean key" : true,
               "boolean key 2" : false,
               "float key" : 1.01,
               "float key 2" : 2.02
              ] as [String : Any]

Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)

Ziel c

NSDictionary *keysAndValues =
  @{@"string key" : @"string value",
    @"string key 2" : @"string value 2",
    @"boolean key" : @(YES),
    @"boolean key 2" : @(NO),
    @"float key" : @(1.01),
    @"float key 2" : @(2.02)};

[[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];

Benutzerdefinierte Protokollnachrichten hinzufügen

Um mehr Kontext für die Ereignisse zu erhalten, die zu einem Absturz geführt haben, können Sie Ihrer App benutzerdefinierte Crashlytics-Protokolle hinzufügen. Crashlytics ordnet die Protokolle mit den Absturz Daten und zeigt sie in der Crashlytics Seite der Firebase - Konsole unter der Registerkarte Protokolle.

Schnell

Verwenden log() oder log(format:, arguments:) zu Hilfe punkt Fragen. Wenn Sie eine nützliche Log - Ausgabe mit Nachrichten erhalten möchten, das Objekt , das Sie passieren log() an die entsprechen müssen CustomStringConvertible Eigenschaft. log() gibt die Beschreibung Eigenschaft , die Sie für das Objekt definieren. Beispielsweise:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")

.log(format:, arguments:) Formate Werte zurückgegeben von Aufruf getVaList() . Beispielsweise:

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))

Weitere Einzelheiten über die Verwendung von log() oder log(format:, arguments:) , beziehen sich auf die Crashlytics Referenzdokumentation .

Ziel c

Verwenden log oder logWithFormat zu Hilfe Pinpoint Fragen. Beachten Sie , wenn Sie eine nützliche Log - Ausgabe mit Nachrichten erhalten möchten, das Objekt , das Sie entweder Methode übergeben müssen , die außer Kraft setzen description Instanz Eigenschaft. Beispielsweise:

[[FIRCrashlytics crashlytics] log:@"Simple string message"];

[[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict];

[[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];

Weitere Einzelheiten über die Verwendung von log und logWithFormat finden Sie in der Crashlytics Referenzdokumentation .

Benutzerkennungen festlegen

Um ein Problem zu diagnostizieren, ist es oft hilfreich zu wissen, bei welchem ​​Ihrer Benutzer ein bestimmter Absturz aufgetreten ist. Crashlytics bietet eine Möglichkeit, Benutzer in Ihren Absturzberichten anonym zu identifizieren.

Um Ihren Berichten Benutzer-IDs hinzuzufügen, weisen Sie jedem Benutzer eine eindeutige Kennung in Form einer ID-Nummer, eines Tokens oder eines Hash-Werts zu:

Schnell

Crashlytics.crashlytics().setUserID("123456789")

Ziel c

[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

Wenn Sie eine Benutzerkennung nach dem Festlegen jemals löschen müssen, setzen Sie den Wert auf eine leere Zeichenfolge zurück. Durch das Löschen einer Benutzerkennung werden vorhandene Crashlytics-Datensätze nicht entfernt. Wenn Sie Datensätze mit einer Benutzer - ID, zugeordnet löschen Kontakt Firebase Unterstützung .

Nicht tödliche Ausnahmen melden

Crashlytics meldet nicht nur automatisch die Abstürze Ihrer App, sondern auch nicht schwerwiegende Ausnahmen und sendet sie beim nächsten Start Ihrer App an Sie.

Sie können nicht-tödliche Ausnahmen aufnehmen , indem Sie die Aufnahme NSError Objekte mit der recordError Methode. recordError fängt den Call - Stack des Threads durch den Aufruf [NSThread callStackReturnAddresses] .

Schnell

Crashlytics.crashlytics().record(error: error)

Ziel c

[[FIRCrashlytics crashlytics] recordError:error];

Bei Verwendung der recordError Methode ist es wichtig , das zu verstehen NSError Struktur und wie nutzt Crashlytics die Daten zu gruppieren stürzt ab. Falsche Verwendung der recordError Methode kann zu unvorhersehbarem Verhalten führen und Crashlytics zu begrenzen verursachen kann für Ihre Anwendung von protokollierten Fehlern berichten.

Ein NSError Objekt hat drei Argumente:

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

Im Gegensatz zu tödlichen Unfällen, die über Stack - Trace - Analyse gruppiert sind, werden protokolliert Fehler durch gruppiert domain und code . Dies ist ein wichtiger Unterschied zwischen schwerwiegenden Abstürzen und protokollierten Fehlern. Beispielsweise:

Schnell

let userInfo = [
NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""),
NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""),
NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""),
"ProductID": "123456",
"View": "MainView"
]

let error = NSError.init(domain: NSCocoaErrorDomain,
                       code: -1001,
                       userInfo: userInfo)

Ziel c

NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil),
NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil),
@"ProductID": @"123456",
@"View": @"MainView",
};

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                   code:-1001
                               userInfo:userInfo];

Wenn Sie den Fehler , der oben einloggen, erstellt es eine neue Ausgabe , die von gruppiert NSSomeErrorDomain und -1001 . Zusätzliche protokollierte Fehler, die dieselben Domänen- und Codewerte verwenden, werden unter demselben Problem gruppiert. Enthaltenen Daten innerhalb des userInfo - Objekt umgewandelt werden Schlüssel-Wert - Paare und in den Tasten angezeigt / logs Abschnitt innerhalb einer einzelnen Ausgabe.

Protokolle und benutzerdefinierte Schlüssel

Genau wie Crash - Berichte, können Sie Protokolle und benutzerdefinierte Schlüssel einbetten Zusammenhang mit dem hinzuzufügen NSError . Es gibt jedoch einen Unterschied darin, welche Protokolle an Abstürze und protokollierte Fehler angehängt werden. Wenn ein Absturz auftritt und die App neu gestartet wird, sind die Protokolle, die Crashlytics von der Festplatte abruft, diejenigen, die bis zum Zeitpunkt des Absturzes geschrieben wurden. Wenn Sie eine log NSError , wird die App nicht sofort beenden. Da Crashlytics sendet nur den protokollierten Fehlerbericht auf dem Abschuss nächsten App und muss die Menge an Speicherplatz für Protokolle auf der Festplatte zugewiesen begrenzen, ist es möglich , genug anmelden , nachdem ein NSError aufgezeichnet wird , so dass alle relevanten Protokolle werden durch die Zeit , rotiert Crashlytics sendet den Bericht vom Gerät. Halten Sie diese Balance im Auge bei der Anmeldung NSErrors und Verwendung von Protokollen und benutzerdefinierte Schlüssel in Ihrer Anwendung.

Leistungsüberlegungen

Beachten Sie, dass eine Anmeldung NSError kann ziemlich teuer sein. Zum Zeitpunkt des Aufrufs erfasst Crashlytics den Aufrufstapel des aktuellen Threads mithilfe eines Prozesses namens Stapelabwickeln. Dieser Prozess kann CPU- und E/A-intensiv sein, insbesondere bei Architekturen, die das DWARF-Unwinding unterstützen (arm64 und x86). Nachdem die Abwicklung abgeschlossen ist, werden die Informationen synchron auf die Festplatte geschrieben. Dies verhindert einen Datenverlust, falls die nächste Zeile abstürzen sollte.

Obwohl es sicher ist, diese API in einem Hintergrundthread aufzurufen, denken Sie daran, dass beim Weiterleiten dieses Aufrufs an eine andere Warteschlange der Kontext des aktuellen Stacktrace verloren geht.

Was ist mit NSExceptions?

Crashlytics bietet keine Einrichtung für die Protokollierung und Aufzeichnung NSException Instanzen direkt. Im Allgemeinen sind die APIs von Cocoa und Cocoa Touch nicht ausnahmesicher. Das bedeutet die Verwendung von @catch kann sehr ernste unbeabsichtigte Nebenwirkungen in Ihrem Prozess, auch wenn sie mit äußerster Vorsicht verwendet. Sie sollten nie verwenden @catch Anweisungen in Ihrem Code. Bitte beachten Sie Apples Dokumentation zum Thema.

Opt-in-Berichte aktivieren

Crashlytics sammelt standardmäßig automatisch Absturzberichte für alle Benutzer Ihrer App. Um Benutzern mehr Kontrolle über die von ihnen gesendeten Daten zu geben, können Sie die Opt-in-Berichterstellung aktivieren, indem Sie die automatische Berichterstellung deaktivieren und Daten nur dann an Crashlytics senden, wenn Sie dies in Ihrem Code wünschen:

  1. Deaktivieren Sie die automatische Sammlung indem Sie einen neuen Schlüssel zum Hinzufügen Info.plist - Datei:

    • Key: FirebaseCrashlyticsCollectionEnabled
    • Wert: false
  2. Aktivieren Sie die Erfassung für ausgewählte Benutzer, indem Sie die Crashlytics-Datenerfassungsüberschreibung zur Laufzeit aufrufen. Der Überschreibungswert bleibt über den Start Ihrer App hinweg bestehen, sodass Crashlytics automatisch Berichte erfassen kann.

    Opt - out des automatischen Crash - Reporting, passieren false als Korrekturwert. Bei Einstellung false , wird der neue Wert nicht bis zum nächsten Laufe der App gilt.

    Schnell

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    

    Ziel c

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
    

Crash Insights-Daten verwalten

Crash Insights hilft Ihnen bei der Lösung von Problemen, indem es Ihre anonymisierten Stack-Traces mit Traces aus anderen Firebase-Apps vergleicht und Sie darüber informiert, ob Ihr Problem Teil eines größeren Trends ist. Für viele Probleme stellt Crash Insights sogar Ressourcen bereit, die Ihnen beim Debuggen des Absturzes helfen.

Crash Insights verwendet aggregierte Absturzdaten, um allgemeine Stabilitätstrends zu identifizieren. Wenn Sie nicht lieber die Daten Ihrer App teilen, können Sie Opt-out - Crash Erkenntnisse aus dem Absturz Insights Menü am oberen Rand Ihrer Crashlytics Ausgabe Liste in der Firebase Konsole .