Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Upgrade auf das Firebase Crashlytics SDK

Sie können Crashlytics jetzt in Ihrer App einrichten, indem Sie das neue offizielle Firebase Crashlytics SDK verwenden, das verbesserte APIs bietet, die mit anderen Firebase-Produkten konsistenter und intuitiver zu verwenden sind.

In dieser Anleitung wird beschrieben, wie Sie vom Legacy-Fabric SDK auf das neue SDK aktualisieren. Es beschreibt die Änderungen, die mit den neuen APIs einhergehen, den Grund für die Änderungen und wie Sie Ihren Code bei Bedarf aktualisieren können.

Bevor Sie beginnen

Schritt 1: Fügen Sie eine Firebase - Konfigurationsdatei

  1. Öffnen Sie Ihre Projekteinstellungen . In der Ihrer Apps Karte, wählen Sie die Bundle - ID des App , für die Sie eine Konfigurationsdatei benötigen.

  2. Klicken Sie auf Download GoogleService-Info.plist auf Ihre Firebase iOS - Konfigurationsdatei (erhalten GoogleService-Info.plist ).

    • Sie können Ihre Download Firebase iOS Config - Datei jederzeit wieder.

    • Stellen Sie sicher , dass der Konfigurationsdateiname wird nicht mit zusätzlichen Zeichen angehängt, wie (2) .

  3. Verschieben Sie Ihre Konfigurationsdatei in das Stammverzeichnis Ihres Xcode-Projekts. Wenn Sie dazu aufgefordert werden, wählen Sie aus, ob die Konfigurationsdatei allen Zielen hinzugefügt werden soll.

Wenn Sie mehr Bündel IDs in Ihrem Projekt haben, müssen Sie jedes Bündel ID mit einer registrierten Anwendung in der Konsole verbinden Firebase so dass jede App eine eigene haben kann GoogleService-Info.plist - Datei.

Schritt 2: Fügen Sie die Firebase Crashlytics SDK

  1. Die in Cocoapods ersetzen Fabric und Crashlytics Schoten mit einer Firebase/Crashlytics pod in allen Zielen.

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. Deinstallieren oder entfernen Sie Abhängigkeiten von Drittanbietern direkt von Fabric, z. B. Abhängigkeiten von Fabric Answers und Kits von Drittanbietern.

  3. Installieren und die Schoten aktualisieren, öffnen Sie Ihre .xcworkspace Datei , um das Projekt in Xcode zu sehen:

    pod install
    open YOUR_PROJECT.xcworkspace

Schritt 3: Aktualisieren Sie Ihren Code

  1. Erstellen Sie in Xcode Ihre App neu und öffnen Sie dann Ihre .xcworkspace-Datei erneut.

  2. Überprüfen Sie die folgenden SDK-Änderungen und nehmen Sie die entsprechenden Aktualisierungen an Ihrem Code vor:


Crashlytics rotiert IDs jetzt basierend auf Firebase-Installations-IDs.

Crashlytics verwendet die Crashlytics-Installations-UUID, um Instanzen Ihrer App zu identifizieren und die Daten Ihrer Benutzer mit ihren Geräten zu verknüpfen. Zuvor hat Crashlytics die Installations-UUID Ihres Benutzers gedreht, wenn sich die Werbe-ID seines Geräts änderte. Jetzt rotiert Crashlytics die Installations-UUID basierend auf der Firebase-Installations-ID (FID) des Benutzers. Weitere Informationen finden Sie unter Verwalten der Installation IDs Firebase .

Änderungsgrund

Die Verwendung von FIDs ist mit anderen Firebase SDKs konsistent.


Die Run- und Upload-Symbol-Skripte befinden sich jetzt in FirebaseCrashlytics.

Sie können nun das Zugriff run und upload-symbols Skripte aus der neuen FirebaseCrashlytics Bibliothek. Beachten Sie, dass Sie immer noch anrufen können upload-symbols überall in Ihrem Build - Prozess manuell laden Sie Ihre dSYMs.

Darüber hinaus ist Stoff API_KEY und BUILD_SECRET sind nicht mehr im neuen SDK enthalten. Stattdessen verwendet Crashlytics jetzt Ihre App GoogleService-info.plist Ihre App mit Ihrem Projekt Firebase zu verknüpfen und Ihre historischen Crash Daten behalten.

Stoff-SDK

${PODS_ROOT}/Fabric/run API_KEY BUILD_SECRET
/path/to/pods/directory/Fabric/upload-symbols

Firebase Crashlytics-SDK

${PODS_ROOT}/FirebaseCrashlytics/run
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols

Änderungsgrund

Crashlytics verwendet das Fabric SDK nicht mehr als Abhängigkeit, daher verschieben wir unsere CLI-Tools in eine neue Bibliothek.


Die Crashlytics-Bibliothek heißt jetzt FirebaseCrashlytics.

Aktualisieren Sie in Ihrer App Ihre Importpfade:

Stoff-SDK

Schnell

import Crashlytics

Ziel c

@import Crashlytics

Firebase Crashlytics-SDK

Schnell

import FirebaseCrashlytics

Ziel c

@import FirebaseCrashlytics

Änderungsgrund

Aktualisieren Sie den Namen der Crashlytics Bibliothek macht es mit anderen Bibliotheken konsistent Firebase (zB FirebaseFirestore und FirebaseAuth ).


FirebaseCrashlytics funktioniert nicht mehr mit dem Fabric SDK.

Nun FirebaseCrashlytics kann nur mit der Firebase Crashlytics SDK initialisiert werden. Sie können eine Instanz starten FirebaseCrashlytics durch den Aufruf FirebaseApp.configure in Swift oder [FIRApp configure] in Objective-C.

In Ihrer application:didFinishLaunchingWithOptions , ersetzen Anrufe Fabric.with und startWithAPIKey mit einem Aufruf an FirebaseApp :

Stoff-SDK

Schnell

Fabric.with([Crashlytics.self])

Ziel c

[Fabric with:@[[Crashlytics class]]];
+ startWithAPIKey:
+ startWithAPIKey:delegate:

Firebase Crashlytics-SDK

Schnell

FirebaseApp.configure()

Ziel c

[FIRApp configure];

Änderungsgrund

Die Verwendung der neuen Methoden zum Initialisieren von Crashlytics entspricht besser der Initialisierung anderer Firebase-Dienste.


Die Methoden crash und throwException werden entfernt.

Das neue SDK enthält nicht mehr die crash oder throwException Methoden. Stattdessen verwendet fatalError in Swift oder ein leeres Array in Objective-C , um einen Absturz zu erzwingen.

Firebase Crashlytics-SDK

Schnell

// Force a test crash
fatalError()

Ziel c

// Force a test crash
@[][1];

Änderungsgrund

Verschiedene Arten von Abstürzen können aus verschiedenen Gründen auftreten, und diese Methoden geben nicht eindeutig an, ob die resultierenden Abstürze während der Laufzeit oder im nativen SDK Ihrer App aufgetreten sind.


Die Methode sharedInstance heißt jetzt crashlytics.

Das neue SDK enthält nicht mehr die sharedInstance Methode. So initialisieren Crashlytics, Verwendung crashlytics statt (lesen Sie in der Referenzdokumentation für Swift oder Objective-C für weitere Informationen). Aktualisieren Sie im Delegaten Ihrer App Ihr ​​Initialisierungsskript:

Stoff-SDK

Schnell

Crashlytics.sharedInstance()

Ziel c

[Crashlytics sharedInstance];

Firebase Crashlytics-SDK

Schnell

Crashlytics.crashlytics()

Ziel c

[FIRCrashlytics crashlytics];

Änderungsgrund

Wir haben die Instanz-Getter-Methode umbenannt, damit sie mit anderen Firebase SDKs konsistent ist.


setUserIdentifier ist jetzt setUserID. setUserName und setUserEmail werden entfernt.

Bisher können Sie einen Namen oder eine E - Mail mit einem Absturz im Zusammenhang gesetzt mit setUserName und setUserEmail , aber diese Methoden nicht mehr definiert werden. Die neue bevorzugte Methode , um Satz - setUserID IDs für die Benutzer zu bedienen setUserID .

Stoff-SDK

Schnell

Crashlytics.sharedInstance().setUserIdentifier("user_id")

Crashlytics.sharedInstance().setUserEmail("user_email")

Crashlytics.sharedInstance().setUserName("user_name")

Ziel c

[[Crashlytics sharedInstance] setUserIdentifier:@"user_id"];

[[Crashlytics sharedInstance] setUserEmail:@"user_email"];

[[Crashlytics sharedInstance] setUserName:@"user_name"];

Firebase Crashlytics-SDK

Schnell

Crashlytics.crashlytics().setUserID("user_id")

Ziel c

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

Änderungsgrund

Wir nahmen den Namen der Methode setUserID mit anderen Firebase APIs und entfernt werden konsistent setUserName und setUserEmail PII durch Crashlytics entmutigen zu protokollieren.


CLSLogv und CLSNSLogv werden durch Protokollierungsfunktionen ersetzt.

Das neue SDK enthält nicht mehr die CLSLogv oder CLSNSLogv Funktionen. Um benutzerdefinierte Protokollnachricht hinzuzufügen , verwenden Sie die neuen Logging - Methoden in der Crashlytics Bibliothek. Beachten Sie, dass die neuen Methoden nicht mehr drucken zu stdout oder NSLog (wir empfehlen schreiben einen Wrapper , wenn Sie dieses Verhalten beibehalten möchten).

Stoff-SDK

Schnell

CLSLogv("%@, %@", getVaList([first_arg, second_arg]))

CLSNSLogv("%@, %@", getVaList([first_arg, second_arg]))

Ziel c

CLSLog(@"%@, %@", first_arg, second_arg);
CLSNSLog(@"%@, %@", first_arg, second_arg);

CLSLogv(@"%@, %@", args_va_list);
CLSNSLogv(@"%@, %@", args_va_list);

CLS_LOG(@"%@, %@", first_arg, second_arg);

Firebase Crashlytics-SDK

Schnell

Crashlytics.crashlytics().log("\(first_arg), \(second_arg)")

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList([first_arg, second_arg]))

Ziel c

[[FIRCrashlytics crashlytics] log:@"first_arg, second_arg"];

[[FIRCrashlytics crashlytics] logWithFormat:@"%@, %@", first_arg, second_arg];

Wenn Sie verwendet CLS_LOG , fügen Sie Folgendes in einer Header - Datei Abrufen der Dateinamen und Zeilennummern in Protokollanweisungen , um fortzufahren!

#define CLS_LOG(__FORMAT__, ...) [[FIRCrashlytics crashlytics] logWithFormat:@"%s line %d $ " __FORMAT__, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]

Änderungsgrund

Die neuen Methoden erfordern Instanzen, was das Testen von Code erleichtert.


setCustomValue ersetzt setObjectValue, setIntValue, setFloatValue und setBoolValue.

Die benutzerdefinierten Setter-Methoden sind nicht mehr im neuen SDK enthalten. Bisher konnten Sie die Methoden verwenden Satz Schlüssel / Wert - Paare mit Crash - Bericht zu senden zusammen. Jetzt können Sie verwenden setCustomValue:forKey zu Satz Schlüssel / Wert - Paare für alle Datentypen.

Stoff-SDK

Schnell

Crashlytics.sharedInstance().setObjectValue("value", forKey: "object_key")

Crashlytics.sharedInstance().setIntValue(100, forKey: "int_key")

Crashlytics.sharedInstance().setFloatValue(99.9, forKey: "float_key")

Crashlytics.sharedInstance().setBoolValue(true, forKey: "bool_key")

Ziel c

[[Crashlytics sharedInstance] setObjectValue:@"key" forKey:@"object_key"];

[[Crashlytics sharedInstance] setIntValue:100 forKey:@"int_key"];

[[Crashlytics sharedInstance] setFloatValue:99.9 forKey:@"float_key"];

[[Crashlytics sharedInstance] setBoolValue:YES forKey:@"bool_key"];

Firebase Crashlytics-SDK

Schnell

Crashlytics.crashlytics().setCustomValue("value", forKey: "object_key")

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

Crashlytics.crashlytics().setCustomValue(99.9, forKey: "float_key")

Crashlytics.crashlytics().setCustomValue(true, forKey: "bool_key")

Ziel c

[[FIRCrashlytics crashlytics] setCustomValue:@"value" forKey:@"object_key"];

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

[[FIRCrashlytics crashlytics] setCustomValue:@(99.9) forKey:@"float_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@YES forKey:@"bool_key"];

Änderungsgrund

Der neue Methodenname ist für Crashlytics eindeutig und macht deutlich, dass Crashlytics nicht schlüsselwertkonform ist.


recordCustomExceptionName:reason:frameArray: wird durch die Ausnahmemodell-API ersetzt.

Wenn Ihre App in einer nicht nativen Umgebung ausgeführt wird (z. B. JavaScript oder Unity), können Sie die Ausnahmemodell-API verwenden, um Absturzmetadaten im nativen Ausnahmeformat Ihrer App zu melden.

Stoff-SDK

Schnell

let topFrame = CLSStackFrame() topFrame.symbol = "doSomethingBad" topFrame.fileName = "bad.cc" topFrame.lineNumber = 23

let middleFrame = CLSStackFrame()
middleFrame.symbol = "doOtherStuff"
middleFrame.fileName = "stuff.cc"
middleFrame.lineNumber = 23;

let bottomFrame = CLSStackFrame()
bottomFrame.symbol = "main"
bottomFrame.fileName = "main.cc"
bottomFrame.lineNumber = 123

Crashlytics.sharedInstance().recordCustomExceptionName("FooException",
                                                       reason: "There was a foo.",
                                                       frameArray: [topFrame, middleFrame, bottomFrame])

Ziel c

CLSStackFrame *topFrame = [[CLSStackFrame alloc] init];
topFrame.symbol = @"doSomethingBad";
topFrame.fileName = @"bad.cc";
topFrame.lineNumber = 23;

CLSStackFrame *middleFrame = [[CLSStackFrame alloc] init];
middleFrame.symbol = @"doOtherStuff";
middleFrame.fileName = @"stuff.cc";
middleFrame.lineNumber = 23;

CLSStackFrame *bottomFrame = [[CLSStackFrame alloc] init];
bottomFrame.symbol = @"main";
bottomFrame.fileName = @"main.cc";
bottomFrame.lineNumber = 123;

[[Crashlytics sharedInstance] recordCustomExceptionName:@"FooException"
                                                 reason:@"There was a foo."
                                             frameArray:@[topFrame, middleFrame, bottomFrame]];

Firebase Crashlytics-SDK

Schnell

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)

Ziel c

model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];

Änderungsgrund

Diese Funktion wurde lange nachgefragt und ermöglicht es Ihnen, Crashlytics auf andere Plattformen wie Unity, Flutter oder React Native zu erweitern.



Das CrashlyticsDelegate wird durch separate Methoden zur Behandlung von Absturzberichten ersetzt.

Sie können jetzt einen neuen Satz von Methoden zum Umgang mit Absturzberichten verwenden:

  • didFinishLaunchingWithOptions wird nun durch die neue Handler ersetzt checkForUnsentReportsWithCompletion .

  • crashlyticsDidDetectReportForLastExecution wird nun ersetzt durch didCrashDuringPreviousExecution . didCrashDuringPreviousExecution kann Ihnen bequem Abstürze erkennen , die während der letzten Ausführung Ihrer Anwendung auftreten.

  • crashlyticsCanUseBackgroundSessions ist nun dauerhaft auf true gesetzt.

  • Wir haben nicht mehr Unterstützung für die Inspektion CLSReport im Delegatobjekt.

Standardmäßig lädt Crashlytics automatisch Absturzberichte beim Start, und man konnte vorher anrufen didFinishLaunchingWithOptions Ihre Benutzer lassen Opt-in zu Crash - Reporting. Nun , wenn Sie anrufen setCrashlyticsCollectionEnabled=false automatische Crash - Meldung zu deaktivieren, Crashlytics ruft checkForUnsentReportsWithCompletion , die Ihre Benutzer können wählen , ob oder nicht Crash - Berichte , wenn die App abstürzt zu senden. Sie können dann rufen sendUnsentReports wenn der Benutzer entscheidet sich in oder deleteUnsentReports , wenn der Benutzer entscheidet sich aus.

Beachten Sie, dass Sie auch anrufen sendUnsentReports und deleteUnsentReports außerhalb von checkForUnsentReportsWithCompletion . Sie können beispielsweise die Absturzberichte dauerhaft einrichten oder deaktivieren, wenn Ihre Benutzer Ihnen eine pauschale Genehmigung oder Ablehnung zum Senden von Absturzberichten erteilt haben. Beachten Sie, dass Sie möglicherweise nie Absturzberichte erhalten, wenn Ihre App zu einem frühen Zeitpunkt im Lebenszyklus abstürzt.

Stoff-SDK

Schnell

class YourClassName: CrashlyticsDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions

    ...
    Crashlytics.sharedInstance().delegate = self
    ...

    return true
  }

  func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    /* ... handle unsent reports */
  }

  func crashlyticsCanUseBackgroundSessions(_ crashlytics: Crashlytics) -> Bool {
    return true
  }
}

Ziel c

@interface YourClassName <CrashlyticsDelegate> ()
@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  ...
  [[Crashlytics sharedInstance] setDelegate:self];
  ...

  return YES;
}

-(void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler {
  // ... handle unsent reports
}

-(BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics {
  return YES;
}

@end

Firebase Crashlytics-SDK

Schnell

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Crashlytics.crashlytics().checkForUnsentReports { hasUnsentReport in
  let hasUserConsent = false
  // ...get user consent.

  if hasUserConsent && hasUnsentReport {
    Crashlytics.crashlytics().sendUnsentReports()
  } else {
    Crashlytics.crashlytics().deleteUnsentReports()
  }
}

// Detect when a crash happens during your app's last run.
if Crashlytics.crashlytics().didCrashDuringPreviousExecution() {
  // ...notify the user.
}

Ziel c

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

[[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL hasUnsentReports) {
  BOOL hasConsent = false;
  // ...get consent from user.

  if (hasConsent && hasUnsentReports) {
    [[FIRCrashlytics crashlytics] sendUnsentReports];
  } else {
    [[FIRCrashlytics crashlytics] deleteUnsentReports];
  }
}];

// Detect when a crash happens during your app's last run.
if ([[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution]) {
  // ...notify the user.
}

Änderungsgrund

Die neuen Methoden geben Ihnen mehr Kontrolle über das Verhalten der Absturzberichte Ihrer App. Außerdem müssen Sie CrashlyticsDelegate nicht mehr einrichten, bevor Sie Crashlytics initialisieren.


firebase_crashlytics_collection_enabled wird durch FirebaseCrashlyticsCollectionEnabled ersetzt.

Wenn Sie setzen FirebaseCrashlyticsCollectionEnabled auf false in Ihrem Info.plist , das Senden Crashlytics stoppt automatisch Absturzberichte beim Start. Nach dem ersten Lauf der App können Sie auch deaktivieren Absturzberichte durch Einstellung setCrashlyticsCollectionEnabled zu false in Ihrem Crashlytics.h , aber beachten Sie, dass setCrashlyticsCollectionEnabled dieses Flag überschreibt.

Deaktivieren Sie die automatische Sammlung durch den Ersatz firebase_crashlytics_collection_enabled Schlüssel in Ihrem Info.plist :

  • Key: FirebaseCrashlyticsCollectionEnabled

  • Wert: false

Nach dem ersten Lauf Ihrer App können Sie auch Sie die automatische Sammlung drehen , indem Sie die folgenden auf Ihre Zugabe Crashlytics.h :

Firebase Crashlytics-SDK

Schnell

// setCrashlyticsCollectionEnabled is set to true by default.
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Ziel c

// setCrashlyticsCollectionEnabled is set to true by default.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

Änderungsgrund

Jetzt haben Sie mehr Kontrolle darüber, wie Crashlytics nicht gesendete Absturzberichte verarbeitet, wenn Sie die automatische Absturzberichterstellung deaktivieren. Nachdem Sie setzen FirebaseCrashlyticsCollectionEnabled auf false, können Sie rufen checkForUnsentReportsWithCompletion von überall in Ihrer Anwendung und entweder senden oder löschen nicht gesendeten Berichte, je nachdem , was Ihre Benutzer wählt.


Crashlytics verwendet jetzt immer Hintergrundsitzungen.

Bisher konnten Sie Hintergrund - Sitzungen deaktivieren , wenn Sie es nicht in Ihrer Anwendung unterstützen wollte , indem crashlyticsCanUseBackgroundSessions auf false gesetzt . Nun crashlyticsCanUseBackgroundSessions wird immer auf true gesetzt.

Änderungsgrund

Wir unterstützen keine iOS-Versionen unter 7.0 oder macOS-Versionen unter OS X 10.9 mehr, die keine Hintergrundsitzungen unterstützen.


Crashlytics kann nur die von Google Analytics gesammelten Daten verwenden.

Nach dem Upgrade auf das Firebase Crashlytics SDK können Sie mit Fabric Answers keine Daten mehr erfassen. Um Messwerte für absturzfreie Nutzer und Breadcrumbs zu erhalten, wechseln Sie stattdessen zu Google Analytics. Beachten Sie, dass Ihre bisherigen Answers-Daten nicht zu Firebase migriert werden können.

Besuchen Sie beginnen mit Google Analytics zu erfahren , wie Google Analytics in Ihrer App hinzuzufügen.

Änderungsgrund

Wir bieten jetzt Google Analytics an, damit Sie mehr Einblick in Ihre Absturzdaten erhalten. Mit Analytics können Sie in der Firebase-Konsole weiterhin Statistiken für Ihre App erfassen.

Nächste Schritte

  • Testen Sie Ihre Implementierung durch einen Test Absturz zwingen , die einen Crash - Bericht zu dem Crashlytics Armaturenbrett in der Firebase Konsole senden.

  • Passen Sie Ihre Crash - Bericht Setup durch Hinzufügen von Opt-in - Reporting, Protokolle, Schlüssel und Verfolgung von nicht-tödlichen Fehler.

  • In Google Analytics in Ihrer App. Kombinieren Sie die Leistung von Google Analytics mit Firebase Crashlytics absturzfrei User - Statistik in der sehen Firebase Konsole .