En el panel de Crashlytics, puede hacer clic en un problema y obtener un informe detallado del evento. Puede personalizar esos informes para ayudarle a comprender mejor lo que sucede en su aplicación y las circunstancias en torno a los eventos informados a Crashlytics.
Informar excepciones no detectadas y excepciones detectadas a Crashlytics.
Instrumente su aplicación para registrar claves personalizadas , mensajes de registro personalizados e identificadores de usuario .
Obtenga automáticamente registros de ruta de navegación si su aplicación utiliza el SDK de Firebase para Google Analytics. Estos registros le brindan visibilidad de las acciones del usuario que conducen a un evento recopilado por Crashlytics en su aplicación.
Desactive los informes automáticos de fallos y habilite los informes de suscripción voluntaria para sus usuarios. Tenga en cuenta que, de forma predeterminada, Crashlytics recopila automáticamente informes de fallos nativos de la plataforma para todos los usuarios de su aplicación.
Informar excepciones no detectadas
Puedes detectar automáticamente todos los errores "fatales" que se producen dentro del marco de Flutter anulando FlutterError.onError
con FirebaseCrashlytics.instance.recordFlutterFatalError
. Alternativamente, para detectar también excepciones "no fatales", anule FlutterError.onError
con FirebaseCrashlytics.instance.recordFlutterError
:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
bool weWantFatalErrorRecording = true;
FlutterError.onError = (errorDetails) {
if(weWantFatalErrorRecording){
FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
} else {
FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
}
};
runApp(MyApp());
}
Errores asincrónicos
El marco Flutter no detecta los errores asincrónicos:
ElevatedButton(
onPressed: () async {
throw Error();
}
...
)
Para detectar este tipo de errores, puede utilizar el controlador PlatformDispatcher.instance.onError
:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FlutterError.onError = (errorDetails) {
FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
};
// Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
PlatformDispatcher.instance.onError = (error, stack) {
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
return true;
};
runApp(MyApp());
}
Errores fuera de Flutter
Para detectar errores que ocurren fuera del contexto de Flutter, instale un detector de errores en el Isolate
actual:
Isolate.current.addErrorListener(RawReceivePort((pair) async {
final List<dynamic> errorAndStacktrace = pair;
await FirebaseCrashlytics.instance.recordError(
errorAndStacktrace.first,
errorAndStacktrace.last,
fatal: true,
);
}).sendPort);
Informar excepciones detectadas
Además de informar automáticamente los fallos de su aplicación, Crashlytics le permite registrar excepciones no fatales y se las envía la próxima vez que se informa un evento fatal o cuando se reinicia la aplicación.
Utilice el método recordError
para registrar excepciones no fatales en los bloques catch de su aplicación. Por ejemplo:
await FirebaseCrashlytics.instance.recordError(
error,
stackTrace,
reason: 'a non-fatal error'
);
// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
Es posible que también desee registrar más información sobre el error, lo cual es posible utilizando la propiedad information
:
await FirebaseCrashlytics.instance.recordError(
error,
stackTrace,
reason: 'a non-fatal error',
information: ['further diagnostic information about the error', 'version 2.0'],
);
Estas excepciones aparecen como problemas no fatales en Firebase console. El resumen del problema contiene toda la información sobre el estado que normalmente se obtiene de los fallos, junto con desgloses por versión y dispositivo de hardware.
Crashlytics procesa excepciones en un subproceso en segundo plano dedicado para minimizar el impacto en el rendimiento de su aplicación. Para reducir el tráfico de red de sus usuarios, Crashlytics limitará la cantidad de informes enviados desde el dispositivo, si es necesario.
Agregar claves personalizadas
Las claves personalizadas lo ayudan a obtener el estado específico de su aplicación antes de fallar. Puede asociar pares clave/valor arbitrarios con sus informes de fallos y luego usar las claves personalizadas para buscar y filtrar informes de fallos en Firebase console.
En el panel de Crashlytics , puede buscar problemas que coincidan con una clave personalizada.
Cuando revisa 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 de instancia setCustomKey
para establecer pares clave/valor. Aquí hay unos ejemplos:
// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');
// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);
// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);
// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);
// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);
// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);
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 fallas y los muestra en Firebase console , en la pestaña Registros de Crashlytics.
Utilice log
para ayudar a identificar problemas. Por ejemplo:
FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");
Establecer identificadores de usuario
Para diagnosticar un problema, suele ser útil saber cuál de sus usuarios experimentó un bloqueo determinado. Crashlytics incluye una forma de identificar usuarios de forma anónima 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:
FirebaseCrashlytics.instance.setUserIdentifier("12345");
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 ID de usuario, comuníquese con el soporte de Firebase .
Obtener registros de ruta de navegación
Los registros de ruta de navegación le brindan una mejor comprensión de las interacciones que tuvo un usuario con su aplicación antes de un evento de falla, no fatal o ANR. Estos registros pueden resultar útiles al intentar reproducir y depurar un problema.
Los registros de ruta de navegación funcionan con Google Analytics, por lo que para obtener registros de ruta de navegación, debe habilitar Google Analytics para su proyecto de Firebase y agregar el SDK de Firebase para Google Analytics a su aplicación. Una vez que se cumplen estos requisitos, los registros de ruta de navegación se incluyen automáticamente con los datos de un evento dentro de la pestaña Registros cuando ve los detalles de un problema.
El SDK de Analytics registra automáticamente el evento screen_view
, lo que permite que los registros de ruta de navegación muestren una lista de las pantallas vistas antes del evento de falla, no fatal o ANR. Un registro de ruta de navegación screen_view
contiene un parámetro firebase_screen_class
.
Los registros de ruta de navegación también se completan con cualquier evento personalizado que registre manualmente dentro de la sesión del usuario, incluidos los datos de los parámetros del evento. Estos datos pueden ayudar a mostrar una serie de acciones del usuario que conducen a un evento de falla, no fatal o ANR.
Tenga en cuenta que puede controlar la recopilación y el uso de los datos de Google Analytics , que incluyen los datos que completan los registros de ruta de navegación.
Habilitar informes de suscripción voluntaria
De forma predeterminada, Crashlytics recopila automáticamente informes de fallos para todos los usuarios de su aplicación. Para brindarles a los usuarios más control sobre los datos que envían, puede habilitar los informes de suscripción deshabilitando los informes automáticos y solo enviando datos a Crashlytics cuando así lo elija en su código:
Desactive la recopilación automática de forma nativa:
plataformas de manzana
Agregue una nueva clave a su archivo
Info.plist
:- Clave:
FirebaseCrashlyticsCollectionEnabled
- Valor:
false
Androide
En el bloque
application
de su archivoAndroidManifest.xml
, agregue una etiquetameta-data
para desactivar la recopilación automática:<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
- Clave:
Habilite la recopilación para usuarios seleccionados llamando a la anulación de la recopilación de datos de Crashlytics en tiempo de ejecución.
El valor de anulación persiste durante los lanzamientos de su aplicación para que Crashlytics pueda recopilar informes automáticamente. Para optar por no recibir informes automáticos de fallos, pase
false
como valor de anulación. Cuando se establece enfalse
, el nuevo valor no se aplica hasta la siguiente ejecución de la aplicación.FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
Administrar datos de Crash Insights
Crash Insights te ayuda a resolver problemas al comparar tus seguimientos de pila anónimos con los de otras aplicaciones de Firebase y te permite saber si tu problema es parte de una tendencia más amplia. Para muchos problemas, Crash Insights incluso proporciona recursos para ayudarle a depurar el fallo.
Crash Insights utiliza datos agregados sobre accidentes para identificar tendencias de estabilidad comunes. Si prefieres no compartir los datos de tu aplicación, puedes optar por no participar en Crash Insights desde el menú Crash Insights en la parte superior de tu lista de problemas de Crashlytics en Firebase console .