Implementación de la manipulación de excepciones Testflight.com y Flurry.com

Estamos utilizando both testflight.com sdk y flurry.com sdk para rastrear excepciones no controladas. El problema es que no hay excepciones recogidas por la ráfaga después de que agregamos el sdk testflight.com.

El método desencadenado cuando se produce una exception no controlada se ve así:

void uncaughtExceptionHandler(NSException *exception) { [FlurryAnalytics logError:@"ERROR_NAME" message:@"ERROR_MESSAGE" exception:exception]; } - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { #if !TARGET_IPHONE_SIMULATOR NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); struct sigaction newSignalAction; memset(&newSignalAction, 0, sizeof(newSignalAction)); newSignalAction.sa_handler = &signalHandler; sigaction(SIGABRT, &newSignalAction, NULL); sigaction(SIGILL, &newSignalAction, NULL); sigaction(SIGBUS, &newSignalAction, NULL); [FlurryAnalytics startSession:kFlurryKey]; [TestFlight takeOff:kTestflightKey]; [[UIApplication shanetworkingApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; [UIApplication shanetworkingApplication].applicationIconBadgeNumber = 0; #endif . . . 

No estoy seguro de cómo lo hace testflight.com, pero parece que interceptan la exception y registran los datos por sí mismos sin permitir que se ejecute el método registrado.

¿Hay alguna forma de que ambos coexistan?

Recibí confirmación del equipo de Testflightapp.com de que se trata de un problema conocido. Esperan arreglarse en la próxima versión que dijeron.

No puedo probar esto directamente, pero la documentation de TestFlight parece decir esto:

Si utiliza excepciones no detectadas o controlleres de señal, instale los controlleres antes de llamar a takeOff. Nuestro SDK llamará a su manejador mientras el nuestro se está ejecutando.

Incluso dan un código de ejemplo que podría ayudarlo a que esto funcione.

He encontrado una solución en un blog, no estoy seguro de si también funciona para Flurry, lo que dice es llamar al método UninstallCrashHandlers (declarado en TestFlight.h) dos veces después del método [TestFlight takeOff: @ "KEY"], y luego registrar otro service para el que desea utilizar para informes de fallas. Ver código de ejemplo para TestFlight vs Crashlytics

Deshabilitar los informes de fallos de TestFlight es bastante simple. Agregue el siguiente código que incluye en AppDelegate.m:

 ... #import TestFlight.h // Function prototype for UninstallCrashHandler extern void UninstallCrashHandlers(BOOL restre); 

En didFinishLaunchingWithOptions llamar primero a este método con NO y luego con YES, como:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [TestFlight takeOff:@"<TestFlightKey>"]; UninstallCrashHandlers(NO); UninstallCrashHandlers(YES); [Crashlytics startWithAPIKey:@"<CrashlyticsKey>"]; return YES; } 

ref: http://www.grahamdennis.me/blog/2012/10/21/how-to-disable-testflights-crash-handlers/