2010-12-03 20 views
2

J'essaie d'ajouter le gestionnaire d'exception global de Matt Gallagher à l'un de mes projets. Exécution de son exemple de projet situé à:iOS - Le gestionnaire d'exception global UncaughtExceptions n'autorise pas l'application à quitter

http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html

je rencontre un problème où je Quit et l'application ne quitte pas. Cela me renvoie juste à l'application. J'ai essayé de tuer l'application avec l'appel kill(), mais je suis incapable de faire quitter l'application.

Le rappel de la fonction alertview ne semble gérer que le cas Continue et ne gère pas le retrait forcé de l'application.

- (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex 
{ 
    if (anIndex == 0) 
    { 
     dismissed = YES; 
    } 
} 

Je sais des applications, par leur nature, ne peuvent pas se quitter, mais dans ce cas si l'application se bloque, je voudrais que l'utilisateur appuie sur le bouton Quitter et avoir l'application quitter.

Merci!

Répondre

5

Apple ne croit pas aux boutons Quitter. Mais vous pouvez lancer une autre exception que vous n'attrapez pas, provoquant le blocage de votre application, mais si votre application tombe en panne, elle ne sera pas approuvée.

Je pense que le plus proche, vous pouvez l'obtenir pour simplement désactiver l'arrière-plan en définissant UIApplicationExitsOnSuspend à true dans votre info.plist, puis en appuyant sur le bouton d'accueil va quitter votre application. Vous pouvez faire en sorte que le bouton Quitter un lien vers n'importe quelle autre application dans ce cas. Si vous modifiez l'instruction if pour toujours déclencher une exception, l'application risque de se bloquer et de se fermer.

- (void)handleException:(NSException *)exception 
{ 
    [self validateAndSaveCriticalApplicationData]; 

    UIAlertView *alert = 
     [[[UIAlertView alloc] 
      initWithTitle:NSLocalizedString(@"Unhandled exception", nil) 
      message:[NSString stringWithFormat:NSLocalizedString(
       @"You can try to continue but the application may be unstable.\n\n" 
       @"Debug details follow:\n%@\n%@", nil), 
       [exception reason], 
       [[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]] 
      delegate:self 
      cancelButtonTitle:NSLocalizedString(@"Quit", nil) 
      otherButtonTitles:NSLocalizedString(@"Continue", nil), nil] 
     autorelease]; 
    [alert show]; 

    CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 
    CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop); 

    while (!dismissed) 
    { 
     for (NSString *mode in (NSArray *)allModes) 
     { 
      CFRunLoopRunInMode((CFStringRef)mode, 0.001, false); 
     } 
    } 

    CFRelease(allModes); 

    NSSetUncaughtExceptionHandler(NULL); 
    signal(SIGABRT, SIG_DFL); 
    signal(SIGILL, SIG_DFL); 
    signal(SIGSEGV, SIG_DFL); 
    signal(SIGFPE, SIG_DFL); 
    signal(SIGBUS, SIG_DFL); 
    signal(SIGPIPE, SIG_DFL); 

    [exception raise]; 
} 
+1

Si vous devez absolument forcer votre application à se fermer, vous pouvez appeler 'abort()'. –

+0

Salut, @Tom, j'ai pris le code ci-dessus pour gérer les exceptions, l'alerte a été montré, mais il n'a jamais répondu à des événements ui, puis jamais rejeté. Une idée? – fifth