2010-12-03 3 views
2

Я пытаюсь добавить обработчик исключений Мэтта Галлахера в один из моих проектов. Запуск его пример проекта, расположенного по адресу:iOS - UncaughtExceptions глобальный обработчик исключений не позволяет app завершить работу

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

Я бегу на вопрос где я нажимаю Quit и приложение не выйдет. Он просто возвращает меня в приложение. Я пытался убить приложение с вызовом kill(), но не смог заставить приложение выйти.

Обратный вызов из alertview только, кажется, обрабатывает случай Continue и не обрабатывает принуждение приложения к завершению.

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

Я знаю, что приложения, по своей природе не может выйти из себя, но в этом случае, если приложение сбой я хотел бы пользователю нажать на кнопку Quit и иметь приложение бросить курить.

Спасибо!

ответ

5

Apple не верит в кнопки выхода. Но вы можете сделать еще одно исключение, которое вы не заразили, вызвав крах вашего приложения, но если ваше приложение выйдет из строя, оно не будет одобрено.

Я думаю, что ближе всего вы можете просто отключить фоновое отображение, установив UIApplicationExitsOnSuspend в true в вашем info.plist, а затем нажав кнопку дома, вы покинете приложение. В этом случае вы можете сделать кнопку «Выход» ссылкой на любое другое приложение.

Изменение инструкции if, чтобы всегда возбуждать исключение, должно привести к сбою вашего приложения, чтобы оно прекратилось.

- (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

Если вам необходимо отключить приложение, вы можете вызвать `abort()`. – 2010-12-03 22:51:27

 Смежные вопросы

  • Нет связанных вопросов^_^