Question

Nous utilisons à la fois le SDK TestFlight.com et le SDK Flurry.com pour suivre les exceptions non gérées. Le problème est qu'aucune exception n'est récupérée par Flurry après avoir ajouté le SDK TestFlight.com.

La méthode déclenchée lorsqu'une exception non perdue se produit ressemble à ceci:

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 sharedApplication]
     registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                     UIRemoteNotificationTypeSound |
                                     UIRemoteNotificationTypeAlert)];    
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;    
    #endif
    .
    .
    .

Je ne sais pas comment Testflight.com le fait, mais il semble qu'ils interceptent l'exception et enregistrent les données par elles-mêmes sans laisser l'exécuter la méthode enregistrée?

Y a-t-il un moyen pour les deux de coexister?

Était-ce utile?

La solution

J'ai obtenu la confirmation de l'équipe TestFlightApp.com que c'est un problème connu. Ils espèrent réparer dans la prochaine version qu'ils ont dit.

Autres conseils

Je ne suis pas en mesure de tester cela directement, mais le Documentation TestFlight semble dire ceci:

Si vous utilisez des gestionnaires d'exception ou de signal non apprises, installez vos gestionnaires avant d'appeler le décollage. Notre SDK appellera ensuite votre gestionnaire pendant que le nôtre est en cours d'exécution.

Ils en donnent même exemple de code Ce qui pourrait vous aider à faire fonctionner cela.

J'ai trouvé une solution sur un blog, je ne sais pas si cela fonctionne également pour Flurry, ce qu'il dit est d'appeler la méthode UNINSTALLCRASHHANDLERS (déclarée dans TestFlight.h) deux fois après [Testflight Takeoff: @ "key"] Méthode, puis je vous inscrite Autre service pour lequel vous souhaitez utiliser pour les rapports de crash. Voir l'exemple de code pour TestFlight vs Crashlytics

La désactivation des rapports de crash de Testflight est assez simple. Ajoutez le code suivant que vos incluses dans AppDelegate.m:

...
#import TestFlight.h

// Function prototype for UninstallCrashHandler
extern void UninstallCrashHandlers(BOOL restore);

Dans didfinishlaunching, les options appellent d'abord cette méthode avec non et ensuite oui, comme:

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [TestFlight takeOff:@"<TestFlightKey>"];

  UninstallCrashHandlers(NO);
  UninstallCrashHandlers(YES);

  [Crashlytics startWithAPIKey:@"<CrashlyticsKey>"];

  return YES;
}

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top