iOS - глобальный обработчик исключений UncaughtExceptions не позволяет закрывать приложение - PullRequest
2 голосов
/ 04 декабря 2010

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

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

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

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

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

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

Спасибо!

1 Ответ

5 голосов
/ 04 декабря 2010

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

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

Изменение оператора 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];
}
...