Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Personalizza i rapporti sugli arresti anomali di Firebase Crashlytics

Questa guida descrive come personalizzare i rapporti sugli arresti anomali utilizzando Firebase Crashlytics SDK. Per impostazione predefinita, Crashlytics raccoglie automaticamente i rapporti sugli arresti anomali per tutti gli utenti della tua app (puoi invece disattivare la segnalazione automatica degli arresti anomali e abilitare invece i rapporti di attivazione per i tuoi utenti). Crashlytics offre quattro meccanismi di registrazione predefiniti: chiavi personalizzate , registri personalizzati , identificativi utente ed eccezioni rilevate .

Aggiungi chiavi personalizzate

I tasti personalizzati ti aiutano a ottenere lo stato specifico dell'app che porta a un arresto anomalo. È possibile associare coppie chiave / valore arbitrarie ai rapporti sugli arresti anomali e visualizzarli nella console di Firebase .

Utilizzare il metodo setCustomValue per impostare coppie chiave / valore. Per esempio:

veloce

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

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

Objective-C

Quando si impostano numeri interi, valori booleani o float, digitare il valore come @( 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"];

È inoltre possibile modificare il valore di una chiave esistente chiamando la chiave e impostandola su un valore diverso. Per esempio:

veloce

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

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

Objective-C

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

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

Aggiungi messaggi di registro personalizzati

Per offrirti più contesto per gli eventi che portano a un arresto anomalo, puoi aggiungere registri Crashlytics personalizzati alla tua app. Crashlytics associa i log ai dati di crash e li visualizza nella pagina Crashlytics della console di Firebase , nella scheda Log .

veloce

Utilizzare log() o log(format:, arguments:) per aiutare a individuare i problemi. Se si desidera ottenere un utile output del registro con i messaggi, l'oggetto che si passa a log() deve essere conforme alla proprietà CustomStringConvertible . log() restituisce la proprietà description definita per l'oggetto. Per esempio:

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

.log(format:, arguments:) formatta i valori restituiti dalla chiamata getVaList() . Per esempio:

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

Per maggiori dettagli su come utilizzare log() o log(format:, arguments:) , consultare la documentazione di riferimento delle funzioni di Crashlytics.

Objective-C

Utilizzare log o logWithFormat per aiutare a individuare i problemi. Si noti che se si desidera ottenere un utile output del registro con i messaggi, l'oggetto che si passa a uno dei due metodi deve sovrascrivere la proprietà dell'istanza di description . Per esempio:

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

Per maggiori dettagli su come utilizzare log e logWithFormat , consultare la documentazione di riferimento delle funzioni di Crashlytics.

Imposta identificativi utente

Per diagnosticare un problema, è spesso utile sapere quale dei tuoi utenti ha subito un determinato arresto anomalo. Crashlytics include un modo per identificare anonimamente gli utenti nei rapporti sugli arresti anomali.

Per aggiungere ID utente ai rapporti, assegnare a ciascun utente un identificatore univoco sotto forma di numero ID, token o valore con hash:

veloce
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

Se è necessario cancellare un identificatore utente dopo averlo impostato, reimpostare il valore su una stringa vuota. La cancellazione di un identificatore utente non rimuove i record Crashlytics esistenti. Se è necessario eliminare i record associati a un ID utente, contattare l'assistenza Firebase .

Segnala eccezioni non fatali

Oltre a segnalare automaticamente gli arresti anomali della tua app, Crashlytics ti consente di registrare eccezioni non fatali e di inviarle al prossimo avvio dell'app.

È possibile registrare eccezioni non fatali registrando oggetti NSError con il metodo recordError . recordError acquisisce lo stack di chiamate del thread chiamando [NSThread callStackReturnAddresses] .

veloce

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

Objective-C

[[FIRCrashlytics crashlytics] recordError: error ];

Quando si utilizza il metodo recordError , è importante comprendere la struttura NSError e come Crashlytics utilizza i dati per raggruppare gli arresti anomali. L'uso errato del metodo recordError può causare comportamenti imprevedibili e può causare che Crashlytics limiti la segnalazione di errori registrati per la tua app.

Un oggetto NSError ha tre argomenti:

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

A differenza degli arresti anomali irreversibili, che sono raggruppati tramite l'analisi dello stack stack, gli errori registrati sono raggruppati per domain e code . Questa è una distinzione importante tra crash fatali ed errori registrati. Per esempio:

veloce

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)

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

Quando si registra l'errore sopra riportato, viene creato un nuovo problema raggruppato da NSSomeErrorDomain e -1001 . Ulteriori errori registrati che utilizzano lo stesso dominio e valori di codice sono raggruppati sotto lo stesso problema. I dati contenuti nell'oggetto userInfo vengono convertiti in coppie chiave-valore e visualizzati nella sezione chiavi / registri all'interno di un singolo problema.

Avviso: evitare di utilizzare valori univoci, come ID utente, ID prodotto e timestamp nei campi dominio e codice. L'uso di valori univoci in questi campi provoca un'elevata cardinalità dei problemi e può comportare la necessità per Crashlytics di limitare la segnalazione degli errori registrati nella tua app. I valori univoci devono invece essere aggiunti all'oggetto dizionario userInfo .

Registri e chiavi personalizzate

Proprio come i rapporti sugli NSError , è possibile incorporare registri e chiavi personalizzate per aggiungere contesto a NSError . Tuttavia, c'è una differenza in quali log sono collegati agli arresti anomali rispetto agli errori registrati. Quando si verifica un arresto anomalo e l'app viene riavviata, i registri recuperati da Crashlytics dal disco sono quelli che sono stati scritti fino al momento del crash. Quando si registra un NSError , l'app non termina immediatamente. Poiché Crashlytics invia il rapporto degli errori registrati solo al successivo avvio dell'app e deve limitare la quantità di spazio allocato per i registri su disco, è possibile registrare abbastanza dopo la registrazione di un NSError modo che tutti i registri pertinenti vengano ruotati al momento dell'invio di Crashlytics il rapporto dal dispositivo. Tenere presente questo equilibrio quando si accede a NSErrors e si utilizzano registri e chiavi personalizzate nella propria app.

Considerazioni sulle prestazioni

Tieni presente che la registrazione di un NSError può essere piuttosto costosa. Nel momento in cui effettui la chiamata, Crashlytics acquisisce lo stack di chiamate del thread corrente usando un processo chiamato stack svolgendo. Questo processo può richiedere molta CPU e I / O, in particolare su architetture che supportano lo svolgimento DWARF (arm64 e x86). Una volta completato lo svolgimento, le informazioni vengono scritte sul disco in modo sincrono. Ciò impedisce la perdita di dati in caso di arresto anomalo della riga successiva.

Mentre è sicuro chiamare questa API su un thread in background, ricorda che l'invio di questa chiamata a un'altra coda perde il contesto della traccia dello stack corrente.

Che dire di NSExceptions?

Crashlytics non offre la possibilità di registrare e registrare direttamente le istanze di NSException . In generale, le API Cocoa e Cocoa Touch non sono eccezionalmente sicure. Ciò significa che l'uso di @catch può avere effetti collaterali indesiderati molto gravi nel processo, anche se usato con estrema cura. Non dovresti mai usare @catch istruzioni @catch nel tuo codice. Fare riferimento alla documentazione di Apple sull'argomento.

Personalizza le tracce dello stack

Se l'app viene eseguita in un ambiente non nativo (come C ++ o Unity), è possibile utilizzare l'API del modello di eccezione per segnalare i metadati di arresto anomalo nel formato di eccezione nativo dell'app. Le eccezioni segnalate sono contrassegnate come non fatali.

veloce

 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)
 

Objective-C

 FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
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],
];
 

Abilita report di attivazione

Per impostazione predefinita, Crashlytics raccoglie automaticamente i rapporti sugli arresti anomali per tutti gli utenti della tua app. Per dare agli utenti un maggiore controllo sui dati che inviano, puoi abilitare i rapporti di opt-in per i tuoi utenti disabilitando la raccolta automatica e inizializzando Crashlytics solo per gli utenti selezionati:

  1. Disattiva la raccolta automatica aggiungendo una nuova chiave al tuo file Info.plist :

    • Chiave: FirebaseCrashlyticsCollectionEnabled
    • Valore: false
  2. Abilita la raccolta per determinati utenti chiamando l'override della raccolta dati di Crashlytics in fase di esecuzione. Il valore di sostituzione persiste durante i lanci della tua app in modo che Crashlytics possa raccogliere automaticamente i rapporti. Per annullare la segnalazione automatica degli arresti anomali, passare false come valore di sostituzione. Se impostato su false , il nuovo valore non si applica fino alla prossima esecuzione dell'app.

    veloce
    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    Objective-C
    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Gestisci i dati di Crash Insights

Crash Insights ti aiuta a risolvere i problemi confrontando le tracce dello stack anonimizzate con le tracce di altre app Firebase e facendoti sapere se il problema fa parte di una tendenza più ampia. Per molti problemi, Crash Insights fornisce anche risorse per aiutarti a eseguire il debug del crash.

Crash Insights utilizza dati aggregati sugli arresti anomali per identificare le tendenze comuni di stabilità. Se preferisci non condividere i dati della tua app, puoi disattivare Crash Insights dal menu Crash Insights nella parte superiore dell'elenco dei problemi di Crashlytics nella console di Firebase .