Dostosuj raporty o awariach Firebase Crashlytics

+

Podręcznik ten opisuje, jak dostosować swoje raporty o awariach pomocą Firebase Crashlytics SDK. Domyślnie Crashlytics automatycznie zbiera raporty o awariach dla wszystkich użytkowników swojej aplikacji (można wyłączyć automatyczne zgłaszanie awarii i umożliwiają raportowanie opt-in dla użytkowników zamiast). Crashlytics zapewnia cztery mechanizmy wylogowaniu z pudełka: niestandardowych klawiszy , niestandardowe dzienniki , identyfikatory użytkowników i złowione wyjątki .

Dodaj własne klucze

Przyciski niestandardowe pomóc specyficzny stan aplikacji doprowadziły do katastrofy. Można skojarzyć dowolne pary klucz / wartość ze swoich raportów o awariach, a następnie użyj przycisków niestandardowych do wyszukiwania i raporty o awariach filtr w konsoli Firebase.

  • W desce rozdzielczej Crashlytics można szukać problemów pasujących klucz niestandardowy.
  • Kiedy Oceniasz problem szczególny w konsoli, można przeglądać powiązane niestandardowe klucze dla każdego zdarzenia ( Keys podkarty), a nawet filtrować zdarzenia według niestandardowych klawiszy (menu filtra na górze strony).

Użyj setCustomValue metody par klucz / wartość. Na przykład:

Szybki

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

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

Cel C

Przy ustalaniu liczby całkowite, wartości logicznych lub pływaków, skrzynka wartość jako @( 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"];

Można również zmodyfikować wartości istniejącego klucza dzwoniąc pod klucz i ustawienie go na inną wartość. Na przykład:

Szybki

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

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

Cel C

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

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

Dodaj pary klucz / wartość luzem za pomocą setCustomKeysAndValues metodę z NSDictionary jako jedyny parametr:

Szybki

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)

Cel 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];

Dodaj niestandardowe komunikaty dziennika

Aby dać sobie więcej kontekst wydarzeń, które doprowadziły do katastrofy, można dodawać własne dzienniki Crashlytics do swojej aplikacji. Crashlytics współpracownicy dzienniki ze swoimi danymi zderzeniowych i wyświetla je na stronie Crashlytics z konsoli Firebase w zakładce logów .

Szybki

Zastosowanie log() lub log(format:, arguments:) do spraw pomocy punktowych. Jeśli chcesz uzyskać użyteczną wyjście z dziennika komunikatów, obiekt, który można przejść do log() musi być zgodne z CustomStringConvertible nieruchomości. log() zwraca opis nieruchomości można zdefiniować dla obiektu. Na przykład:

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

.log(format:, arguments:) formaty Wartości zwracane przez wywołanie getVaList() . Na przykład:

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

Aby uzyskać więcej informacji na temat korzystania z log() lub log(format:, arguments:) , odnoszą się do Crashlytics dokumentacji referencyjnej .

Cel C

Wykorzystanie log lub logWithFormat do spraw pomocy punktowych. Zauważ, że jeśli chcesz uzyskać użyteczną wyjście z dziennika komunikatów, obiekt, który można przejść do każdej metody musi zastąpić description własności instancji. Na przykład:

[[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];

Aby uzyskać więcej informacji na temat korzystania z log i logWithFormat , patrz Crashlytics dokumentacji referencyjnej .

Zestaw identyfikatorów użytkowników

Aby zdiagnozować problem, to często pomocne wiedzieć, który z użytkowników doświadczyła daną awarię. Crashlytics obejmuje drogę anonimowo identyfikacji użytkowników w swoich raportach zderzeniowych.

Aby dodać identyfikatory użytkowników do raportów, przypisać każdemu użytkownikowi unikalny identyfikator w postaci numeru identyfikacyjnego, token lub wartość hashed:

Szybki

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

Cel C

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

Jeśli kiedykolwiek potrzeba, aby usunąć identyfikator użytkownika po jej ustawieniu wyzerować wartość na pusty ciąg. Usuwanie użytkownika, identyfikator nie usuwa istniejące rekordy Crashlytics. Jeśli chcesz usunąć rekordy powiązane z identyfikatorem użytkownika, kontaktów wsparcia Firebase .

Zgłoś non-śmiertelnych wyjątki

Oprócz automatycznego zgłaszania awarii w aplikacji, Crashlytics pozwala nagrywać non-śmiertelnych wyjątki i wysyła je do Ciebie następnym razem swoich startów aplikacji.

Można nagrywać non-śmiertelnych wyjątki nagrywając NSError obiektów z recordError metody. recordError oddaje wątku stosu wywołań poprzez wywołanie [NSThread callStackReturnAddresses] .

Szybki

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

Cel C

[[FIRCrashlytics crashlytics] recordError:error];

Podczas korzystania z recordError sposób, ważne jest, aby zrozumieć NSError strukturę i jak Crashlytics wykorzystuje dane do awarii grupowych. Nieprawidłowe korzystanie z recordError metody może spowodować nieprzewidywalne zachowanie i może powodować Crashlytics do limitu sprawozdawczą zalogowanych błędów dla swojej aplikacji.

NSError obiekt ma trzy argumenty:

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

W przeciwieństwie do śmiertelnych wypadków, które pogrupowano poprzez analizy śladowej stos, rejestrowane błędy są pogrupowane według domain i code . Jest to ważne rozróżnienie między śmiertelnych wypadków i zalogowaniu błędów. Na przykład:

Szybki

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)

Cel 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];

Po zalogowaniu się błąd powyżej, tworzy nowy problem, który jest pogrupowany według NSSomeErrorDomain i -1001 . Dodatkowe zalogowany błędy, które korzystają z tej samej domeny i kod wartości są zgrupowane w tej samej kwestii. Dane zawarte w userInfo obiektu są konwertowane do par klucz-wartość i wyświetlona w klawisze / loguje sekcję w ramach danej emisji.

Dzienniki i niestandardowe klawisze

Podobnie jak zderzeniowych raportów, można osadzić dzienników i niestandardowe przyciski, aby dodać kontekst do NSError . Jednak istnieje różnica w co dzienniki są dołączone do wypadków w porównaniu zalogowanych błędów. W przypadku wystąpienia awarii, a aplikacja jest odnowiona, dzienniki Crashlytics wyszukuje z dysku są te, które zostały napisane aż do chwili katastrofy. Po zalogowaniu się NSError , aplikacja nie natychmiast rozwiązać. Bo tylko Crashlytics wysyła zalogowany raport o błędzie na następnym uruchomieniu aplikacji i muszą ograniczyć ilość miejsca przeznaczonego na dzienniki na dysku, możliwe jest, aby zalogować się na tyle po przeprowadzeniu NSError są zapisywane tak, że wszystkie istotne dzienniki są obracane przez czas Crashlytics wysyła raport z urządzenia. Należy zachować tę równowagę w umyśle podczas logowania NSErrors i korzystania z dzienników i niestandardowe klucze w swojej aplikacji.

Uwagi dotyczące wydajności

Należy pamiętać, że zalogowaniu się NSError może być dość kosztowne. W momencie nawiązania połączenia, Crashlytics przechwytuje bieżącego wątku za stosu wywołań za pomocą procesu zwanego stos odwijania. Proces ten może być procesora I / O intensywne, zwłaszcza w architekturach wsparcie KARŁOWATA odwijania (arm64 i x86). Po odpoczynek jest kompletna, informacje są zapisywane na dysk synchronicznie. To zapobiega utracie danych, jeśli następny wiersz były do katastrofy.

O ile jest to bezpieczne, aby wywołać tę API na wątek tła, należy pamiętać, że wysyłając wezwanie do innej kolejki traci kontekst bieżącego śladu stosu.

Co o NSExceptions?

Crashlytics nie oferuje usługi na potrzeby rejestrowania i nagrywania NSException instancji bezpośrednio. Ogólnie rzecz biorąc, API Cocoa i Cocoa Touch nie są wyjątkiem bezpieczny. Oznacza to, że korzystanie z @catch może mieć bardzo poważne niezamierzonych skutków ubocznych w procesie, nawet kiedy jest stosowany ze szczególną ostrożnością. Nigdy nie należy używać @catch oświadczenia w kodzie. Proszę odnieść się do dokumentacji Apple na ten temat.

Dostosuj stos ślady

Jeśli twoje aplikacja działa w nie-natywnym środowisku (takie jak C ++ lub Jedności), można użyć API Wyjątek modelu zgłaszania awarii metadane w natywnym formacie wyjątków swojej aplikacji. Zgłaszane wyjątki oznaczone są jako nie-Fatals.

Szybki

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

crashlytics.record(exceptionModel:ex)

Cel C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" file:@"handler.js" line:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" file:@"routes.js" line:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" file:@"app.js" line:12],
];

[[FIRCrashlytics crashlytics] recordExceptionModel:model];

Niestandardowe ramki stosu może być również zainicjowany z adresami tylko:

Szybki

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(address:0xfa12123),
  StackFrame(address:12412412),
  StackFrame(address:194129124),
]

crashlytics.record(exceptionModel:ex)

Cel C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithAddress:0xfa12123],
  [FIRStackFrame stackFrameWithAddress:12412412],
  [FIRStackFrame stackFrameWithAddress:194129124],
];


[[FIRCrashlytics crashlytics] recordExceptionModel:model];

Włącz opt-in raportowania

Domyślnie Crashlytics automatycznie zbiera raporty o awariach dla użytkowników wszystkich Twoich aplikacji. Aby zapewnić użytkownikom większą kontrolę nad danymi, które wysyłają, można włączyć opt-in raportowania poprzez wyłączenie automatycznego raportowania i tylko wysyła dane do Crashlytics jeśli zdecydujesz się w kodzie:

  1. Wyłączanie automatycznego zbierania dodając nowy klucz do Info.plist pliku:

    • Klucz: FirebaseCrashlyticsCollectionEnabled
    • Wartość: false
  2. Włącz kolekcję dla wybranych użytkowników poprzez wywołanie zbierania danych nadpisanie Crashlytics przy starcie. Te wartości override powtarzał całej startów w swojej aplikacji tak Crashlytics może automatycznie gromadzić raporty.

    Aby zrezygnować z automatycznego zgłaszania awarii, przekaż false jako wartość override. Gdy ustawiony na false , nowa wartość nie stosuje się aż do następnego uruchomienia aplikacji.

    Szybki

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Cel C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Zarządzanie danymi zderzeniowe Insights

Zderzeniowe Insights pomaga rozwiązać problemy poprzez porównanie anonimowych ślady stosu na ślady innych aplikacjach Firebase i powiadomieniem, jeśli problem jest częścią większego trendu. Dla wielu kwestiach, crash Insights nawet zapewnia zasoby mające na celu debugowania awarię.

Zderzeniowe Insights używa zagregowanych danych o awariach do określenia wspólnych trendów stabilności. Gdyby wolisz nie udostępniać dane aplikacji, można zrezygnować z katastrofy Insights z menu zderzeniowe Insights na górze listy emisyjnej Crashlytics w konsoli Firebase .