获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Personaliza tus informes de fallas de Firebase Crashlytics

Esta guía describe cómo personalizar sus informes de fallas usando el SDK de Firebase Crashlytics. De forma predeterminada, Crashlytics recopila automáticamente informes de fallas para todos los usuarios de su aplicación (puede desactivar los informes automáticos de fallas y habilitar los informes opcionales para sus usuarios en su lugar). Crashlytics proporciona cuatro mecanismos de registro listos para usar: claves personalizadas, registros personalizados , identificadores de usuario y excepciones detectadas .

Añadir claves personalizadas

Las claves personalizadas lo ayudan a obtener el estado específico de su aplicación antes de que se bloquee. Puede asociar pares clave/valor arbitrarios con sus informes de fallas y luego usar las claves personalizadas para buscar y filtrar informes de fallas en la consola de Firebase.

  • En el panel de control de Crashlytics , puede buscar problemas que coincidan con una clave personalizada.
  • Cuando está revisando un problema específico en la consola, puede ver las claves personalizadas asociadas para cada evento ( subpestaña Claves ) e incluso filtrar los eventos por claves personalizadas ( menú Filtro en la parte superior de la página).

Utilice el método setCustomValue para establecer pares clave/valor. Por ejemplo:

Rápido

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

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

C objetivo

Al configurar números enteros, booleanos o flotantes, encuadre el valor como @( 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"];

También puede modificar el valor de una clave existente llamando a la clave y estableciéndola en un valor diferente. Por ejemplo:

Rápido

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

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

C objetivo

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

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

Agregue pares clave/valor de forma masiva utilizando el método setCustomKeysAndValues ​​con un NSDictionary como único parámetro:

Rápido

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)

C objetivo

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

Agregar mensajes de registro personalizados

Para tener más contexto sobre los eventos que conducen a un bloqueo, puede agregar registros personalizados de Crashlytics a su aplicación. Crashlytics asocia los registros con sus datos de bloqueo y los muestra en la página de Crashlytics de Firebase console , en la pestaña Registros .

Rápido

Use log() o log(format:, arguments:) para ayudar a identificar problemas. Si desea obtener una salida de registro útil con mensajes, el objeto que pasa a log() debe cumplir con la propiedad CustomStringConvertible . log() devuelve la propiedad de descripción que define para el objeto. Por ejemplo:

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

.log(format:, arguments:) da formato a los valores devueltos al llamar a getVaList() . Por ejemplo:

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

Para obtener más detalles sobre cómo usar log() o log(format:, arguments:) , consulte la documentación de referencia de Crashlytics .

C objetivo

Use log o logWithFormat para ayudar a identificar problemas. Tenga en cuenta que si desea obtener una salida de registro útil con mensajes, el objeto que pase a cualquiera de los métodos debe anular la propiedad de instancia de description . Por ejemplo:

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

Para obtener más detalles sobre cómo usar log y logWithFormat , consulte la documentación de referencia de Crashlytics.

Establecer identificadores de usuario

Para diagnosticar un problema, a menudo es útil saber cuál de sus usuarios experimentó un bloqueo determinado. Crashlytics incluye una forma de identificar de forma anónima a los usuarios en sus informes de fallos.

Para agregar ID de usuario a sus informes, asigne a cada usuario un identificador único en forma de número de ID, token o valor hash:

Rápido

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

C objetivo

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

Si alguna vez necesita borrar un identificador de usuario después de configurarlo, restablezca el valor a una cadena en blanco. Borrar un identificador de usuario no elimina los registros de Crashlytics existentes. Si necesita eliminar registros asociados con una identificación de usuario, comuníquese con el soporte de Firebase .

Reportar excepciones no fatales

Además de informar automáticamente los bloqueos de su aplicación, Crashlytics le permite registrar excepciones no fatales y se las envía la próxima vez que se inicia su aplicación.

Puede registrar excepciones no fatales al registrar objetos NSError con el método recordError . recordError captura la pila de llamadas del subproceso llamando a [NSThread callStackReturnAddresses] .

Rápido

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

C objetivo

[[FIRCrashlytics crashlytics] recordError:error];

Al usar el método recordError , es importante comprender la estructura de NSError y cómo Crashlytics usa los datos para agrupar bloqueos. El uso incorrecto del método recordError puede causar un comportamiento impredecible y puede hacer que Crashlytics limite los informes de errores registrados para su aplicación.

Un objeto NSError tiene tres argumentos:

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

A diferencia de los accidentes fatales, que se agrupan mediante un análisis de seguimiento de pila, los errores registrados se agrupan por domain y code . Esta es una distinción importante entre bloqueos fatales y errores registrados. Por ejemplo:

Rápido

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)

C objetivo

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

Cuando registra el error anterior, crea un nuevo problema que se agrupa por NSSomeErrorDomain y -1001 . Los errores registrados adicionales que usan el mismo dominio y valores de código se agrupan bajo el mismo problema. Los datos contenidos en el objeto userInfo se convierten en pares clave-valor y se muestran en la sección de claves/registros dentro de un problema individual.

Registros y claves personalizadas

Al igual que los informes de fallas, puede incrustar registros y claves personalizadas para agregar contexto al NSError . Sin embargo, existe una diferencia entre los registros que se adjuntan a los bloqueos y los errores registrados. Cuando se produce un bloqueo y se reinicia la aplicación, los registros que Crashlytics recupera del disco son los que se escribieron hasta el momento del bloqueo. Cuando registra un NSError , la aplicación no finaliza inmediatamente. Debido a que Crashlytics solo envía el informe de error registrado en el próximo lanzamiento de la aplicación y debe limitar la cantidad de espacio asignado para los registros en el disco, es posible registrar lo suficiente después de que se registre un NSError para que todos los registros relevantes se eliminen en el momento en que Crashlytics envía el informe del dispositivo. Tenga en cuenta este equilibrio cuando registre NSErrors y use registros y claves personalizadas en su aplicación.

Consideraciones de rendimiento

Tenga en cuenta que registrar un NSError puede ser bastante costoso. En el momento en que realiza la llamada, Crashlytics captura la pila de llamadas del subproceso actual mediante un proceso llamado desenrollado de pila. Este proceso puede ser intensivo en CPU y E/S, particularmente en arquitecturas que admiten el desenredado DWARF (arm64 y x86). Una vez que se completa el desenrollado, la información se escribe en el disco de forma síncrona. Esto evita la pérdida de datos si la siguiente línea falla.

Si bien es seguro llamar a esta API en un subproceso en segundo plano, recuerde que enviar esta llamada a otra cola pierde el contexto del seguimiento de la pila actual.

¿Qué pasa con las NSExceptions?

Crashlytics no ofrece una función para registrar y registrar instancias de NSException directamente. En términos generales, las API Cocoa y Cocoa Touch no están protegidas contra excepciones. Eso significa que el uso de @catch puede tener efectos secundarios no deseados muy graves en su proceso, incluso cuando se usa con sumo cuidado. Nunca debe usar declaraciones @catch en su código. Consulte la documentación de Apple sobre el tema.

Habilitar informes de suscripción

De forma predeterminada, Crashlytics recopila automáticamente informes de fallas para todos los usuarios de su aplicación. Para dar a los usuarios más control sobre los datos que envían, puede habilitar la opción de informes desactivando los informes automáticos y solo enviando datos a Crashlytics cuando lo elija en su código:

  1. Desactive la recopilación automática agregando una nueva clave a su archivo Info.plist :

    • Clave: FirebaseCrashlyticsCollectionEnabled
    • Valor: false
  2. Habilite la recopilación para usuarios seleccionados llamando a la anulación de recopilación de datos de Crashlytics en tiempo de ejecución. El valor de anulación persiste entre los lanzamientos de su aplicación para que Crashlytics pueda recopilar informes automáticamente.

    Para optar por no recibir informes automáticos de fallas, pase false como valor de anulación. Cuando se establece en false , el nuevo valor no se aplica hasta la próxima ejecución de la aplicación.

    Rápido

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    C objetivo

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Administrar datos de Crash Insights

Crash Insights lo ayuda a resolver problemas comparando sus seguimientos de pila anónimos con los de otras aplicaciones de Firebase y permitiéndole saber si su problema es parte de una tendencia más amplia. Para muchos problemas, Crash Insights incluso proporciona recursos para ayudarlo a depurar el bloqueo.

Crash Insights utiliza datos de fallas agregados para identificar tendencias de estabilidad comunes. Si prefiere no compartir los datos de su aplicación, puede excluirse de Crash Insights desde el menú Crash Insights en la parte superior de su lista de problemas de Crashlytics en la consola de Firebase .