sirve - ha ocurrido un problema al descargar el software para el iphone
Mejores prácticas para el registro de errores y/o informes para iPhone (4)
¿Sabes que CrashReporter para iPhone existe?
Hay un repository en github que muestra ese código.
Tiene algunas características interesantes, como asignar el seguimiento de la pila a su código y administra algunas cosas específicas de git como hashes de versión.
Cuando realizo el desarrollo web, uso un registrador personalizado que detecta errores fatales, agrega un rastro a un archivo y muestra un mensaje al usuario. Ocasionalmente, puedo echar un vistazo para ver si el archivo cambió, lo que significa que algún usuario encontró un error y puedo investigar para ver qué encontraron.
Me gustaría algo similar en el iPhone, con algunas advertencias:
- Durante el desarrollo, debería ser trivial restablecer la lista de errores o desactivar la notificación.
- Durante el desarrollo, los mensajes de error también deberían aparecer en algún lugar obvio, como en la pantalla de la consola.
- Una vez implementados, los errores deben enviarse cortésmente a la nave nodriza para su análisis (para una corrección de errores en la próxima actualización)
- Active el registro de seguimiento / información cuando intente localizar un problema durante el desarrollo
- Desactive el registro de la consola para ''Liberar'' para acelerar las cosas para el usuario
- Se debe limpiar después de sí mismo para ser un buen ciudadano en el teléfono.
Algunos enlaces relacionados
- Usando GSLog en lugar de NSLog
- iniciar sesión en un archivo en el iphone
- En Mac, la gente dice que Apple System Logger y GTM Logger son el camino a seguir para las mejores prácticas de registro de objetivos.
- Entrada de blog de Jeff A en el registro
Parece que habría un conjunto de herramientas común para hacer esto. ¿Cómo manejas esto?
[Actualización de octubre de 2011] Ha habido algunos desarrollos, de diferente madurez ...
- PLCrashReporter .
- Quincy sienta encima de PLC.
- Bugsense comercial reportero de choque.
- Crittercism informes de fallos y errores (algunos paquetes gratuitos, algunos pagados).
- El vuelo de prueba ahora tiene un SDK que detecta fallos (pero aún no para aplicaciones de la tienda de aplicaciones, solo para aplicaciones de desarrollo).
- Al igual que Test Flight, Hockey tiene como objetivo combinar la distribución ad hoc con informes de fallas.
Apple recopila automáticamente los registros de bloqueo de los usuarios para usted, y puede descargarlos desde iTunes Connect.
Si eso no es suficiente para usted, no conozco un kit de herramientas, pero no me gustaría lanzar algo por mi cuenta, personalmente. Parece demasiado esfuerzo para desarrollar algo robusto, podría generar problemas de privacidad y, al final, con 100,000K de aplicaciones en la tienda de aplicaciones, ¿cuántos usuarios volverían a usar tu aplicación después de descubrir que tenía errores?
Esto es lo que hacemos:
- Deje que el iPhone maneje sus propios volcados de memoria a través de los mecanismos existentes del App Store . Actualización : al encontrar que iTunes Connect no es confiable para proporcionar informes de Fabric/Crashlytics , recomiendo usar Fabric/Crashlytics o un competidor como Crittercism o Rollbar .
- Nuestro producto lanzado no tiene rastro, esto parece ser consistente con lo que la mayoría de las otras aplicaciones de iPhone hacen.
- Si se informa de un error, lo reproducimos utilizando una compilación rastreada.
Con más detalle:
- Definimos macros para rastrear NSLog en numerosos niveles diferentes de granularidad.
- Use la configuración de compilación de Xcode para cambiar el nivel de rastreo, que controla la cantidad de rastreo que se compila en el producto, por ejemplo, hay configuraciones de compilación de lanzamiento y depuración.
- Si no se define ningún nivel de rastreo, entonces mostramos el rastreo completo en el simulador, y ningún rastro cuando se ejecuta en un dispositivo real.
He incluido un código de ejemplo a continuación que muestra cómo hemos escrito esto y cómo se ve la salida.
Definimos múltiples niveles de traza diferentes para que los desarrolladores puedan identificar qué líneas de traza son importantes y pueden filtrar detalles de nivel inferior si lo desean.
Código de ejemplo:
- (void)myMethod:(NSObject *)xiObj
{
TRC_ENTRY;
TRC_DBG(@"Boring low level stuff");
TRC_NRM(@"Higher level trace for more important info");
TRC_ALT(@"Really important trace, something bad is happening");
TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
TRC_EXIT;
}
Ejemplo de salida de rastreo:
2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]
Nuestras definiciones de trazas:
#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif
/*****************************************************************************/
/* Entry/exit trace macros */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT NSLog(@"EXIT: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif
/*****************************************************************************/
/* Debug trace macros */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif
#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif
#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif
#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif
Configuraciones de Xcode:
En la configuración de compilación Xcode, elija "Agregar configuración definida por el usuario" (haciendo clic en el pequeño engranaje en la parte inferior izquierda de la pantalla de configuración de la compilación), luego defina una nueva configuración llamada GCC_PREPROCESSOR_DEFINITIONS
y GCC_PREPROCESSOR_DEFINITIONS
el valor TRC_LEVEL=0
.
La única sutileza es que Xcode no sabe hacer una construcción limpia si cambia esta configuración, así que recuerde hacer una limpieza manualmente si la cambia.
Recomiendo encarecidamente CocoaLumberJack de Robbie Hanson: https://github.com/robbiehanson/CocoaLumberjack
Es muy flexible y potente, incluso un poco excesivo si se abusa de él. Soporta diferentes niveles de registro. El registro de archivos se puede activar con un par de líneas de código e incluso enviarse a través de la red.