Из Руководства пользователя Apple для людей ...
Не выходить программно
Никогда не выходите из приложения iOS программно, потому что люди склонны
интерпретировать это как крах. Однако, если внешние обстоятельства мешают
ваше приложение функционирует как задумано, вы должны сообщить
пользователи о ситуации и объяснить, что они могут с этим поделать.
В зависимости от того, насколько серьезна неисправность приложения, у вас есть два
выбор.
Покажите привлекательный экран, который описывает проблему и предлагает
коррекция. Экран обеспечивает обратную связь, которая заверяет пользователей, что
нет ничего плохого в вашем приложении. Это дает пользователям контроль,
позволяя им решить, хотят ли они предпринять корректирующие действия и
продолжить использование приложения или нажмите кнопку «Домой» и откройте
другое приложение
Если не работают только некоторые функции вашего приложения, отобразите
либо экран, либо предупреждение, когда люди активируют эту функцию. дисплей
предупреждение только тогда, когда люди пытаются получить доступ к функции, которая не
функционирование.
Если вы решили, что собираетесь все равно выйти программно ...
В C exit(0)
остановит выполнение приложения. Это означает, что никакие методы делегата или обработчики исключений не будут вызваны. Таким образом, если цель состоит в том, чтобы удостовериться, что некоторый код вызывается при закрытии, даже при принудительном закрытии, может быть другой вариант. В вашем AppDelegate
реализован пользовательский метод, называемый чем-то вроде -(void)applicaitonIsgoingAway
. Вызовите этот метод из любого места, где вы хотите, чтобы ваш код выхода вызывался:
applicationWillTerminate
applicationDidEnterBackground
onUncaughtException
Первые два - это те, которые вы уже упоминали в своем вопросе. Третий может быть универсальным. Это глобальный обработчик исключений. Этот следующий бит взят из вопроса по этой самой теме .
Этот обработчик исключений будет вызываться для любых необработанных исключений (которые в противном случае могли бы привести к сбою вашего приложения). Из этого обработчика вы можете позвонить applicaitonIsgoingAway
, как и в двух других случаях. Из другого вопроса, который я упоминал выше, вы можете найти ответ, подобный этому.
void onUncaughtException(NSException* exception)
{
[[AppDelegate sharedInstance] applicationIsgoingAway];
}
Но для того, чтобы это работало, вам нужно настроить этот метод как обработчик исключений, например ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&onUncaughtException);
//There may already be more code in this method.
}
Теперь вы можете программно выйти из приложения, вызвав NSAssert(FALSE, @"Quitting the app programmatically.");
Пока нет другого обработчика исключений, чтобы поймать это, ваше приложение начнет аварийно завершаться и будет вызываться код вашего обработчика исключений. вызов по очереди applicationIsGoingAway
.