Ahora puedes configurar Crashlytics en tu app con el nuevo SDK oficial de Firebase Crashlytics, que ofrece API mejoradas que son más coherentes con otros productos de Firebase y más intuitivas de usar.
En esta guía, se describe cómo realizar la actualización al nuevo SDK desde el SDK heredado de Fabric. También se describen los cambios que traen las nuevas API, el motivo de los cambios y cómo actualizar tu código, si es necesario.
Antes de comenzar
Paso 1: Agrega un archivo de configuración de Firebase
Abre la Configuración del proyecto. En la tarjeta Tus apps, selecciona el ID del paquete de la app cuyo archivo de configuración necesitas.
Haz clic en Descargar GoogleService-Info.plist a fin de obtener el archivo de configuración de Firebase para plataformas de Apple (
GoogleService-Info.plist
).Puedes volver a descargar el archivo cuando quieras.
Asegúrate de que no se hayan agregado caracteres adicionales, como
(2)
, al nombre del archivo de configuración.
Traslada el archivo de configuración al directorio raíz de tu proyecto de Xcode. Si se te solicita, selecciona la opción para agregar el archivo de configuración a todos los destinos.
Si tienes varios ID de paquete en tu proyecto, debes asociar cada uno de ellos a una app registrada en Firebase console para que cada app tenga su propio archivo GoogleService-Info.plist
.
Paso 2: Agrega el SDK de Firebase Crashlytics
En CocoaPods, reemplaza los pods
Fabric
yCrashlytics
por un podFirebase/Crashlytics
en todos los destinos.# Add the pod for Firebase Crashlytics pod 'Firebase/Crashlytics'
# Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'Desinstala o quita dependencias de terceros directamente de Fabric, como dependencias de Fabric Answers y kits de terceros.
Instala y actualiza los pods y abre el archivo
.xcworkspace
para ver el proyecto en Xcode. Puedes hacerlo con los siguientes comandos:pod install
open YOUR_PROJECT.xcworkspace
Paso 3: Actualiza tu código
En Xcode, vuelve a compilar la app y abre el archivo .xcworkspace.
Revisa los siguientes cambios del SDK y realiza las actualizaciones correspondientes en tu código:
Crashlytics ahora rota los ID en función de los ID de instalación de Firebase
Crashlytics usa el UUID de instalación de Crashlytics para identificar instancias de tu app y asociar los datos de los usuarios con sus dispositivos. Anteriormente, Crashlytics rotaba el UUID de instalación del usuario cuando cambiaba el ID de publicidad de su dispositivo. Ahora Crashlytics rota el UUID de instalación según el ID de instalación de Firebase (FID) del usuario. Para obtener más información, consulta cómo administrar los ID de instalación de Firebase.
Motivo del cambio
El uso de FID es coherente con otros SDK de Firebase.
Las secuencias de comandos de símbolos de ejecución y carga ahora están disponibles en FirebaseCrashlytics
Ahora puedes acceder a las secuencias de comandos run
y upload-symbols
desde la nueva biblioteca FirebaseCrashlytics
. Ten en cuenta que aún puedes llamar a upload-symbols
en cualquier punto del proceso de compilación a fin de subir los dSYM de forma manual.
Además, API_KEY y BUILD_SECRET de Fabric ya no se incluyen en el nuevo SDK. En su lugar, Crashlytics ahora usa el archivo GoogleService-info.plist
de tu app para asociarla con el proyecto de Firebase y conservar tus datos de fallas históricas.
SDK de Fabric
${PODS_ROOT}/Fabric/run API_KEY BUILD_SECRET /path/to/pods/directory/Fabric/upload-symbols
SDK de Firebase Crashlytics
${PODS_ROOT}/FirebaseCrashlytics/run /path/to/pods/directory/FirebaseCrashlytics/upload-symbols
Motivo del cambio
Crashlytics ya no usa el SDK de Fabric como dependencia, por lo que trasladaremos nuestras herramientas de CLI a una biblioteca nueva.
La biblioteca de Crashlytics ahora se llama FirebaseCrashlytics
En tu app, actualiza tus rutas de importación:
SDK de Fabric
Swift
import Crashlytics
Objective‑C
@import Crashlytics
SDK de Firebase Crashlytics
Swift
import FirebaseCrashlytics
Objective‑C
@import FirebaseCrashlytics
Motivo del cambio
Actualizar el nombre de la biblioteca Crashlytics
hace que sea coherente con otras bibliotecas de Firebase (p. ej., FirebaseFirestore
y FirebaseAuth
).
FirebaseCrashlytics ya no funciona con el SDK de Fabric
Ahora, FirebaseCrashlytics
solo se puede inicializar con el SDK de Firebase Crashlytics. Puedes iniciar una instancia de FirebaseCrashlytics
llamando a FirebaseApp.configure
en Swift o [FIRApp configure]
en Objective-C.
En tu application:didFinishLaunchingWithOptions
, reemplaza las llamadas a Fabric.with
y startWithAPIKey
por una llamada a FirebaseApp
:
SDK de Fabric
Swift
Fabric.with([Crashlytics.self])
Objective‑C
[Fabric with:@[[Crashlytics class]]];
+ startWithAPIKey:
+ startWithAPIKey:delegate:
SDK de Firebase Crashlytics
Swift
FirebaseApp.configure()
Objective‑C
[FIRApp configure];
Motivo del cambio
El uso de los nuevos métodos para inicializar Crashlytics es más coherente con la forma en que se inicializan otros servicios de Firebase.
Se quitaron los métodos crash y throwException
El nuevo SDK ya no incluye los métodos crash
ni throwException
. En su lugar, usa fatalError
en Swift o un arreglo vacío en Objective‑C para forzar fallas.
SDK de Firebase Crashlytics
Swift
// Force a test crash
fatalError()
Objective‑C
// Force a test crash
@[][1];
Motivo del cambio
Los diferentes tipos de fallas pueden ocurrir por varias razones. Estos métodos no especificaban claramente si las fallas resultantes ocurrieron durante el tiempo de ejecución o en el SDK nativo de tu app.
El método sharedInstance ahora se llama crashlytics
El nuevo SDK ya no incluye el método sharedInstance
.
Para inicializar Crashlytics, usa crashlytics
(consulta la documentación de referencia de Objective‑C o Swift para obtener más información). En el delegado de la app, actualiza la secuencia de comandos de inicialización de la siguiente manera:
SDK de Fabric
Swift
Crashlytics.sharedInstance()
Objective‑C
[Crashlytics sharedInstance];
SDK de Firebase Crashlytics
Swift
Crashlytics.crashlytics()
Objective‑C
[FIRCrashlytics crashlytics];
Motivo del cambio
Cambiamos el nombre del método get para captar instancias a fin de que sea coherente con otros SDK de Firebase.
setUserIdentifier ahora es setUserID, y se quitaron setUserName y setUserEmail
Anteriormente, podías configurar un nombre o correo electrónico asociado con una falla mediante setUserName
y setUserEmail
, pero estos métodos ya no se definirán.
A fin de establecer ID para los usuarios ahora se prefiere el método setUserID
.
SDK de Fabric
Swift
Crashlytics.sharedInstance().setUserIdentifier("user_id")
Crashlytics.sharedInstance().setUserEmail("user_email")
Crashlytics.sharedInstance().setUserName("user_name")
Objective‑C
[[Crashlytics sharedInstance] setUserIdentifier:@"user_id"];
[[Crashlytics sharedInstance] setUserEmail:@"user_email"];
[[Crashlytics sharedInstance] setUserName:@"user_name"];
SDK de Firebase Crashlytics
Swift
Crashlytics.crashlytics().setUserID("user_id")
Objective‑C
[[FIRCrashlytics crashlytics] setUserID:@"user_id"];
Motivo del cambio
Adoptamos el nombre de método setUserID
para que sea coherente con otras API de Firebase y quitamos setUserName
y setUserEmail
a fin de evitar el registro de PII a través de Crashlytics.
Se reemplazaron CLSLogv y CLSNSLogv por funciones de registro
El nuevo SDK ya no incluye las funciones CLSLogv
o CLSNSLogv
. Para agregar mensajes de registro personalizados, usa los nuevos métodos de registro en la biblioteca Crashlytics
.
Ten en cuenta que los métodos nuevos ya no se imprimen en stdout
o NSLog
(recomendamos que escribas un wrapper si deseas mantener este comportamiento).
SDK de Fabric
Swift
CLSLogv("%@, %@", getVaList([first_arg, second_arg]))
CLSNSLogv("%@, %@", getVaList([first_arg, second_arg]))
Objective‑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);
SDK de Firebase Crashlytics
Swift
Crashlytics.crashlytics().log("\(first_arg), \(second_arg)")
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList([first_arg, second_arg]))
Objective‑C
[[FIRCrashlytics crashlytics] log:@"first_arg, second_arg"];
[[FIRCrashlytics crashlytics] logWithFormat:@"%@, %@", first_arg, second_arg];
Si usaste CLS_LOG
, agrega lo siguiente a un archivo de encabezado para seguir obteniendo nombres de archivos y números de líneas en las instrucciones de registro:
#define CLS_LOG(__FORMAT__, ...) [[FIRCrashlytics crashlytics] logWithFormat:@"%s line %d $ " __FORMAT__, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]
Motivo del cambio
Los nuevos métodos requieren instancias, lo que facilita la prueba del código.
setCustomValue reemplazará a setObjectValue, setIntValue, setFloatValue y setBoolValue
Los métodos set personalizados ya no se incluyen en el nuevo SDK.
Anteriormente, podías usar los métodos para configurar pares clave-valor y enviarlos junto con el informe de fallas. Ahora, puedes usar setCustomValue:forKey
a fin de definir pares clave-valor para todos los tipos de datos.
SDK de Fabric
Swift
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")
Objective‑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"];
SDK de Firebase Crashlytics
Swift
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")
Objective‑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"];
Motivo del cambio
El nombre del método nuevo es exclusivo de Crashlytics y deja en claro que Crashlytics no cumple con el formato clave-valor.
Se reemplazó recordCustomExceptionName:reason:frameArray: por la API de Exception Model
Si tu app se ejecuta en un entorno no nativo (p. ej., JavaScript o Unity), puedes usar la API de Exception Model para informar metadatos de fallas en el formato de excepción nativo de la app.
SDK de Fabric
Swift
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])
Objective‑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]];
SDK de Firebase Crashlytics
Swift
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
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],
];
Motivo del cambio
Esta función se ha solicitado por mucho tiempo y te permite extender Crashlytics a otras plataformas, como Unity, Flutter o React Native.
Se reemplazó CrashlyticsDelegate por métodos independientes para manejar informes de fallas
Ahora puedes usar un nuevo conjunto de métodos para manejar los informes de fallas:
didFinishLaunchingWithOptions
ahora se reemplaza por el nuevo controladorcheckForUnsentReportsWithCompletion
.crashlyticsDidDetectReportForLastExecution
ahora se reemplaza pordidCrashDuringPreviousExecution
.didCrashDuringPreviousExecution
te permite detectar de manera conveniente las fallas que ocurren durante la última ejecución de tu app.crashlyticsCanUseBackgroundSessions
ahora se configura permanentemente como true.Ya no se admite la inspección del objeto
CLSReport
en el delegado.
De forma predeterminada, Crashlytics sube automáticamente los informes de fallas durante el inicio. Antes se podía llamar a didFinishLaunchingWithOptions
para permitir que los usuarios aceptaran el envío de informes de fallas.
Ahora, cuando llamas a setCrashlyticsCollectionEnabled=false
para desactivar los informes de fallas automáticos, Crashlytics llama a checkForUnsentReportsWithCompletion
, lo que permite a los usuarios elegir si enviar o no informes cuando la app falla. Luego, puedes llamar a sendUnsentReports
si el usuario acepta o adeleteUnsentReports
si no.
Ten en cuenta que también puedes llamar a sendUnsentReports
y deleteUnsentReports
fuera de checkForUnsentReportsWithCompletion
. Por ejemplo, es posible que quieras configurar o inhabilitar de forma permanente los informes de fallas si los usuarios te han dado aprobación o rechazo general para enviar informes de fallas. Ten en cuenta que es posible que nunca recibas informes de fallas si tu app falla al comienzo del ciclo de vida.
SDK de Fabric
Swift
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
}
}
Objective‑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
SDK de Firebase Crashlytics
Swift
/* 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.
}
Objective‑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.
}
Motivo del cambio
El nuevo conjunto de métodos te da más control sobre el comportamiento de los informes de fallas de la app. Además, ya no necesitas configurar CrashlyticsDelegate antes de inicializar Crashlytics.
Se reemplazó firebase_crashlytics_collection_enabled por FirebaseCrashlyticsCollectionEnabled
Cuando configuras FirebaseCrashlyticsCollectionEnabled
como false en tu Info.plist
, Crashlytics deja de enviar automáticamente informes de fallas durante el inicio. Después de la primera ejecución de la app, también puedes inhabilitar los informes de fallas si configuras setCrashlyticsCollectionEnabled
como false
en Crashlytics.h
, pero ten en cuenta que setCrashlyticsCollectionEnabled
anula esta marca.
Para desactivar la recopilación automática, reemplaza la clave firebase_crashlytics_collection_enabled
en Info.plist
:
Clave:
FirebaseCrashlyticsCollectionEnabled
Valor:
false
Después de la primera ejecución de tu app, también puedes desactivar la recopilación automática si agregas lo siguiente a tu Crashlytics.h
:
SDK de Firebase Crashlytics
Swift
// setCrashlyticsCollectionEnabled is set to true by default.
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)
Objective‑C
// setCrashlyticsCollectionEnabled is set to true by default.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];
Motivo del cambio
Ahora tienes más control sobre la forma en que Crashlytics maneja los informes de fallas no enviados cuando inhabilitas los informes automáticos. Después de configurar FirebaseCrashlyticsCollectionEnabled
como false, puedes llamar a checkForUnsentReportsWithCompletion
desde cualquier lugar de la app y enviar o borrar informes no enviados, según lo que elija el usuario.
Ahora Crashlytics siempre usa sesiones en segundo plano
Antes, podías desactivar las sesiones en segundo plano si no querías admitir esta modalidad en tu app. Para ello, se debía configurar crashlyticsCanUseBackgroundSessions
como false.
Ahora, crashlyticsCanUseBackgroundSessions
siempre está configurado como true.
Motivo del cambio
Ya no admitimos versiones de iOS anteriores a 7.0 o macOS anteriores a OS X 10.9, ya que no admiten sesiones en segundo plano.
Crashlytics solo puede usar los datos que recopila Google Analytics
Una vez que actualices al SDK de Firebase Crashlytics, ya no podrás recopilar datos con Fabric Answers. Para obtener métricas de rutas de navegación y usuarios que no experimentaron fallas, cambia a Google Analytics. Ten en cuenta que los datos históricos de Answers no se pueden migrar a Firebase.
Consulta los primeros pasos para usar Google Analytics si necesitas información sobre cómo agregar este servicio a tu app.
Motivo del cambio
Ahora ofrecemos Google Analytics para ayudarte a recopilar datos de fallas más detallados. Con Analytics, puedes seguir recopilando estadísticas de tu app en Firebase console.
Próximos pasos
Prueba la implementación. Para ello, fuerza una falla de prueba que envíe un informe de fallas al panel de Crashlytics en Firebase console.
Personaliza la configuración de informes de fallas agregando informes, registros y claves opcionales, así como seguimiento de errores recuperables.
Agrega Google Analytics a tu app. Combina la potencia de Google Analytics con Firebase Crashlytics para ver estadísticas de los usuarios sin fallas en Firebase console.