Правильный способ выхода из приложения iPhone?

277

Я программирую приложение для iPhone, и мне нужно заставить его выйти из-за определенных действий пользователя. После очистки памяти, выделенной приложению, какой метод следует вызвать для завершения приложения?

user21293
источник
34
Есть только один правильный путь - кнопка «Домой»
бериллий
5
Единственная ситуация, которую я могу себе представить, если кто-то собирается выйти из программы программно, это следующий сценарий: приложение запускается, отображает условия использования, отказывается принять и затем выходит из приложения. Это то, что бренды иногда заставляют разработчика делать. Но это неправильно.
Даниэль
6
@Daniel Обычно вы загружаете ваше заявление об отказе от ответственности / условия использования (EULA) при загрузке приложения. Если пользователь загружает ваше приложение, это означает, что он принял ваше лицензионное соглашение
Пол де Ланге
8
Существуют вполне веские причины для принудительного выхода из приложения IOS. В моем случае я распространяю бета-версии моего приложения перед запуском. Бета-версии открывают все IAP бесплатно. Они имеют ограничение по времени и должны истечь через несколько недель. Поэтому я использую ответ ниже, чтобы убить приложение после окончания периода бета-тестирования. Я удалю это в версии LIVE. Но все же ответ помог мне и является правильным!
badweasel
5
Одной из действительных причин выхода из приложения является то, что это приложение с долговременным фоновым исполнением и приложение переходит в состояние, в котором ему больше не нужно работать в фоновом режиме. Например, пользователь выходит из системы. В этом случае имеет смысл выйти, чтобы при следующем запуске приложения оно начинало очищаться. Это послужит защитной сетью от утечек памяти, среди прочих причин. Обратите внимание, что в этом случае приложение будет выходить из фона , поэтому пользователь не заметит ничего плохого.
frankodwyer

Ответы:

217

Ты пробовал exit(0)?

В качестве альтернативы, [[NSThread mainThread] exit]хотя я не пробовал, это кажется более подходящим решением.

Brett
источник
85
Так как это Apple - «нет-нет» (может привести к отклонению вашего приложения в магазине приложений из-за нестандартного интерфейса), ответ Августа считается «правильным». К вашему сведению, этот ответ (Бретта) правильный для ВСЕХ программ на C, а NSThread для всех программ Какао.
Оли
21
В Tech Q & A QA1561 Apple настоятельно рекомендует не использовать выход, так как кажется, что приложение зависло. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr
8
[[NSThread mainThread] exit] приводит к сбою приложения, поскольку exit не является методом экземпляра. exit (0) отправит приложение в фоновый режим в iOS 4. Повторный вызов exit (0) приведет к его падению. По крайней мере, в симуляторе.
user123444555621
10
Я понимаю, почему так много людей советуют против этого, но как насчет того, чтобы дать нам разработчики некоторый кредит? Мы все здесь взрослые, и мы хотим знать об этой функции. Я нахожу это очень полезным для внутренних сборок QA и, когда я впервые его искал, был рад увидеть этот «неправильный» ответ.
evanflash
7
@ Кевин "Не делай этого" никогда не будет правильным ответом. Дайте предупреждения и отказы от ответственности, если хотите, но единственный правильный ответ на вопрос «как мне это сделать» - «вот как это сделать». Если я ищу, как что-то сделать (возможно, я хочу заставить его выйти во время отладки), люди справедливо заявляют: «Вы не делаете!» и пытаться похоронить ответ, который мне нужен, - пустая трата времени. Несмотря на то, что у многих людей могут быть плохие причины что-то делать, правильный ответ StackOverflow - тот, который отвечает на вопрос, потому что люди с уважительными причинами также будут искать свой путь к нему.
Гленн Мейнард
274

На iPhone нет концепции выхода из приложения. Единственное действие, которое должно привести к закрытию приложения, - это нажать кнопку «Домой» на телефоне, и разработчики не имеют к этому доступа.

Согласно Apple, ваше приложение не должно завершаться само по себе. Поскольку пользователь не нажимал кнопку «Домой», любой возврат к главному экрану создает у пользователя впечатление, что ваше приложение не работает. Это запутанное, нестандартное поведение, и его следует избегать.

августейший
источник
13
Как я уже сказал, это нестандартное поведение, и его следует избегать. Приложения для iPhone не являются настольными приложениями. Не относитесь к ним как к таковым.
Август
8
Я могу понять мнение Apple, но у меня похожая ситуация, мое приложение требует доступа в Интернет, если оно недоступно, они должны иметь возможность покинуть приложение, а не просто получить сообщение об ошибке
Anthony Main
22
У нас есть приложения, которые помогают людям спать. Они хотят, чтобы приложение завершало работу через определенный период времени, чтобы уменьшить разрядку аккумулятора. Я думаю, что этот случай является приемлемым, поскольку, как мы надеемся, пользователь спит и не может выйти из приложения вручную.
JamesSugrue
36
Я все еще не согласен. Когда они просыпаются, приложение «исчезает», заставляя пользователя задуматься о том, что случилось. Вместо этого установите таймер в вашем приложении, затем, когда время истечет, простаиваете приложение - никаких действий. Приложение, которое ничего не делает, не разряжает батарею. Springboard - это тоже приложение - оно не закрывается только для экономии энергии. Вместо этого он просто ждет ввода пользователя.
Август
8
Это на самом деле не отвечает на вопрос. Это на 100% точно, но я думаю, что в идеале это был бы комментарий либо к вопросу ОП, либо к принятому ответу.
Бен Зотто
49

exit (0) отображается для пользователя как сбой, поэтому покажите пользователю подтверждающее сообщение. После подтверждения приостановите (нажмите кнопку «Домой» программно) и подождите 2 секунды, пока приложение движется в фоновом режиме с анимацией, затем выйдите из поля зрения пользователя.

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}
MaxEcho
источник
1
Apple утвердит этот «выход (0)»? Потому что некоторые люди говорят, что яблоко будет отклонять ваше приложение, когда вы используете выход 0.
Gajendra K Chauhan
2
@GajendraKChauhan exit(0)не имеет значения. Дело в том, что у вашего приложения "поведение при выходе". Сам по себе выход из поведения запрещен в AppStore, за исключением нескольких приложений, созданных очень важными сторонними разработчиками. Кроме того, имитация поведения кнопки «Домой» также может быть отклонена.
Eonil
41

Проверьте вопросы и ответы здесь: https://developer.apple.com/library/content/qa/qa1561/_index.html

В: Как программно выйти из приложения iOS?

Не предусмотрено API для изящного завершения приложения iOS.

В iOS пользователь нажимает кнопку «Домой», чтобы закрыть приложения. Если в вашем приложении есть условия, при которых оно не может обеспечить выполнение своей предполагаемой функции, рекомендуемый подход заключается в отображении предупреждения для пользователя, в котором указывается характер проблемы и возможные действия, которые может предпринять пользователь - включение WiFi, включение служб определения местоположения и т. Д. Разрешить пользователю завершать работу приложения по своему усмотрению.

ВНИМАНИЕ: не вызывайте exitфункцию. Вызов приложений exitбудет казаться пользователю сбойным, вместо того, чтобы выполнить постепенное завершение и выполнить анимацию обратно на главный экран.

Кроме того, данные не могут быть сохранены, потому что -applicationWillTerminate:и аналогичные UIApplicationDelegateметоды не будут вызываться, если вы вызываете exit.

Если во время разработки или тестирования необходимо завершить работу приложения, рекомендуется использовать abortфункцию или assertмакрос

Wagh
источник
2
Просто добавил AlertView без кнопок, чтобы соответствовать этому. Легко.
Schultz9999
Отличный ответ, только что работал с exit (0) и не знал, что он принадлежит частному API
Alex
39

Это не способ выйти из программы, а способ заставить людей выйти из программы.

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

источник
2
По крайней мере, на симуляторе, если вы сделаете это, предупреждение все равно будет там, когда пользователь повторно откроет приложение. Таким образом, я предлагаю дать им хотя бы одну кнопку.
Чеширеков
Используйте ответ Каляна, чтобы приложение закрывалось при нажатии кнопки «Домой».
Тимур Кучкаров
Проблема в том, что он на самом деле не выходит из приложения, поэтому все, что разработчик может захотеть выполнить, выйдя из системы (выбрасывая недопустимый / старый пользовательский интерфейс, удаляя константы и т. Д.), Не будет выполнено, если пользователь не проведет пальцем по приложению закрыто.
Бен Легжеро
Это не убивает приложение.
Дастин
38

Зайдите в ваш info.plist и проверьте ключ «Приложение не запускается в фоновом режиме». На этот раз, когда пользователь нажимает кнопку «Домой», приложение полностью закрывается.

Калян
источник
1
Но фоновый процесс также получить уволить.
Гаджендра К Чаухан
17

Добавить UIApplicationExitsOnSuspendнедвижимость на application-info.plistв true.

Аман Агарвал
источник
Можно ли изменить этот параметр во время выполнения? Я имею в виду, что я хочу жить в фоновом режиме, за исключением случаев, когда мое приложение ВЫБИРАЕТСЯ завершить работу при следующей приостановке - когда я захочу представить UIApplicationExitsOnSuspend. Это возможно?
Мотти Шнеор
13

После некоторых тестов могу сказать следующее:

  • использование частного интерфейса: [UIApplication sharedApplication]приложение будет выглядеть так, как будто оно зависло, НО оно будет вызывать - (void)applicationWillTerminate:(UIApplication *)applicationперед этим;
  • Использование exit(0);также завершит работу приложения, но оно будет выглядеть «нормально» (значки трамплина выглядят так, как ожидалось, с эффектом уменьшения), НО это не вызовет - (void)applicationWillTerminate:(UIApplication *)applicationметод делегата.

Мой совет:

  1. Вручную позвоните - (void)applicationWillTerminate:(UIApplication *)applicationделегату.
  2. Вызов exit(0);.
rchampourlier
источник
Apple говорит, что не следует использовать выход из-за того, что «приложения, вызывающие выход, будут казаться сбойному пользователю, а не выполнять постепенное завершение и анимацию на главном экране» developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD
8

Ваш ApplicationDelegate получает уведомление о намеренном выходе пользователя:

- (void)applicationWillResignActive:(UIApplication *)application {

Когда я получаю это уведомление, я просто звоню

        exit(0);

Который делает всю работу. И самое главное, это намерение пользователей выйти, поэтому это не должно быть проблемой, вызывая его там.

В моем Audio-App было необходимо выйти из приложения после того, как люди синхронизировали свое устройство, пока музыка еще играла. Как только синхронизация завершена, я получаю уведомление. Но выход из приложения сразу после этого будет выглядеть как сбой.

Поэтому вместо этого я установил флаг, чтобы ДЕЙСТВИТЕЛЬНО выйти из приложения при следующем фоновом действии. Что нормально для обновления приложения после синхронизации.

L'г
источник
1
Это не очень хорошее решение, так как приложение подаст в отставку по другим причинам, таким как входящий телефонный звонок.
frankodwyer
Решение состоит в том, чтобы добавить проверку, которая завершается, только если это полезно. Например, если пользователь находится на начальном экране. Тогда это нормально, даже если поступит телефонный звонок. Apple не отклоняла это с iOS 2 в моих приложениях. stackoverflow.com/a/43906936/712124
кот
6

Мое приложение было отклонено недавно, потому что я использовал недокументированный метод. Буквально:

«К сожалению, его нельзя добавить в App Store, поскольку он использует частный API. Использование непубличных API, как описано в разделе 3.3.1 Лицензионного соглашения программы для разработчиков iPhone, запрещено:

«3.3.1 Приложения могут использовать документированные API только в порядке, установленном Apple, и не должны использовать или вызывать какие-либо частные API».

Непубличный API, включенный в ваше приложение, является terminateWithSuccess "


источник
6

Apple говорит:

«Предупреждение: не вызывайте функцию выхода. Приложения, вызывающие выход, будут казаться пользователю потерпевшим крах, а не выполнять постепенное завершение и анимацию обратно на главный экран».

Я думаю, что это плохое предположение. Если пользователь нажимает кнопку «Выход» и появляется сообщение, в котором говорится что-то вроде: «Теперь приложение будет закрыто», значит, оно не будет аварийно завершено. Apple должна предоставить правильный способ выхода из приложения (не выход (0)).

AGPX
источник
3
Они делают это, нажимая кнопку Home, она может быть расположена внизу любого iDevice. Поэтому из-за этого нет необходимости создавать собственную кнопку выхода.
Popeye,
4

Это получил хороший ответ, но решил немного расширить:

Вы не можете принять ваше приложение в AppStore, если не будете внимательно читать Руководство по интерфейсу iOS для Apple. (они сохраняют за собой право отклонить вас делать что - либо против них) Раздел «Не Quit» Программная http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. HTML это точное руководство, как вы должны относиться в этом случае.

Если у вас возникли проблемы с платформой Apple, для которой вы не можете легко найти решение, обратитесь в HIG. Возможно, Apple просто не хочет, чтобы вы это делали, и они обычно (я не Apple, поэтому я не могу гарантировать всегда), говорят об этом в своей документации.

nanonyme
источник
3

Хм, вам может потребоваться выйти из приложения, если, скажем, ваше приложение требует подключения к Интернету. Вы можете отобразить предупреждение, а затем сделать что-то вроде этого:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
обкрадывать
источник
9
Нет, вам не нужно прекращать это. Например, приложение iTunes, когда оно не может обнаружить правильное соединение, просто отображает экран, на котором указано, что они не подключены. Он не уходит, он просто информирует пользователя о том, что происходит. Затем пользователь выходит, нажав кнопку домой.
август
1
Тем не менее, приложение компаса закрывается, если оно не может функционировать.
Джош Ли
3

Мы не можем выйти из приложения , используя exit(0), abort()функцию, так как Apple , сильно препятствовать использованию этих функций. Хотя вы можете использовать эти функции для разработки или тестирования.

Если во время разработки или тестирования необходимо завершить работу приложения, рекомендуется использовать функцию прерывания или макрос подтверждения

Пожалуйста, найдите эту ветку вопросов и ответов Apple, чтобы получить больше информации.

Как использование этой функции создает впечатление, что приложение падает. Поэтому у меня появилось предположение, что мы можем отобразить Alert с сообщением о завершении для осведомленного пользователя о закрытии приложения из-за недоступности определенных функций.

Но iOS Руководство по интерфейсу пользователя для запуска и остановки приложения , предлагая никогда не использовать кнопку Выйти или Закрыть для завершения приложения. Скорее, они предлагают отобразить правильное сообщение, чтобы объяснить ситуацию.

Приложение iOS никогда не отображает опцию Закрыть или Выйти. Люди перестают использовать приложение, когда переключаются на другое приложение, возвращаются на главный экран или переводят свои устройства в спящий режим.

Никогда не выходите из приложения iOS программным способом. Люди склонны интерпретировать это как крах. Если что-то мешает вашему приложению работать должным образом, вам нужно рассказать пользователям о ситуации и объяснить, что они могут с этим сделать.

technerd
источник
2

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

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

Крис Джефферсон
источник
Пожалуйста, измените ваш ответ в текущем сценарии IOS4.0 и UP ..: P
rptwsthi
2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}
Прабху Натараджан
источник
1

Я использовал упомянутый выше подход [[NSMutableArray new] addObject: nil], чтобы принудительно завершить (аварийно завершить работу) приложение без вызова контрольной функции выхода (0).

Зачем? Потому что мое приложение использует закрепление сертификатов во всех вызовах сетевого API для предотвращения атак «человек посередине». К ним относятся вызовы инициализации, которые мое финансовое приложение делает при запуске.

Если проверка подлинности сертификата не удалась, все мои инициализации вызывают ошибку и оставляют мое приложение в неопределенном состоянии. Позволить пользователю вернуться домой и вернуться обратно в приложение не поможет, поскольку, если приложение не было очищено ОС, оно все еще не инициализировано и ненадежно.

Итак, в этом одном случае мы посчитали целесообразным выдать предупреждение, информирующее пользователя о том, что приложение работает в небезопасной среде, а затем, когда они нажали «Закрыть», принудительно завершить работу приложения, используя вышеупомянутый метод.

Майкл Лонг
источник
Я не вижу, что вас удерживает от отображения одного полноэкранного мирского оповещения, сообщающего пользователю, что приложение не может использоваться по этим причинам «закрепления сертификата», и все. Пользователь в конечном итоге закроет приложение. Возможно, вы не знаете, но iOS оставляет за собой право убить ваш процесс (сохранить его состояние) и восстановить его позже, и «жизненный цикл» приложения iOS на самом деле не в ваших руках. Ваш сбой - это просто сбой, и операционная система может решить восстановить приложение в любом случае.
Мотти Шнеор
Ух ты, трехлетний пост. В любом случае, новая архитектура приложения в значительной степени делает это с помощью кнопки повтора, которая повторяет API-интерфейс и либо сбрасывает экран блока, либо возвращает их на экран блока с новой ошибкой.
Майкл Лонг
Старая структура приложения практически не позволяла повторять вызовы API запуска, и приложение находилось в несовместимом состоянии без них. Мы могли бы использовать экран постоянной блокировки, но это требовало от пользователя принудительного выхода из приложения, и было решено, что не каждый пользователь знает, КАК дважды щелкнуть и принудительно закрыть приложения. Проще сегодня, но довольно скрыто три года назад.
Майкл Лонг
1
[[UIApplication sharedApplication] terminateWithSuccess];

Работало нормально и автоматически звонит

- (void)applicationWillTerminateUIApplication *)application delegate.

чтобы убрать предупреждение о времени компиляции добавьте этот код

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
шива
источник
5
Это частный метод, Диего Меркадо объяснил выше, что его приложение было отклонено, тогда зачем рисковать.
RVN
Использование частного API приведет к отклонению приложения от Apple.
ZYiOS
2
для корпоративного приложения - это может быть решением.
user1140780
- (IBAction) exitApp: (id) отправитель {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self executeSelector: селектор с объектом: [UIApplication sharedApplication]]; }
Unom
@unmircea прошел этот обзор?
Великолепно
1

Вы не должны напрямую вызывать функцию, так exit(0)как она немедленно выйдет из приложения и будет выглядеть так, как будто ваше приложение не работает. Поэтому лучше показывать пользователям оповещения о подтверждении и позволять им делать это самостоятельно.

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Использование:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
Тигр
источник
0

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

Если есть ошибка: лучше ее внедрите или оповестите пользователя. Если должен быть перезапуск: Внедрите его лучше. Сообщите пользователю.

Звучит глупо, но это плохая практика - выходить из приложения, не позволяя пользователю решать и не уведомляя его. И, как утверждает Apple, поскольку есть кнопка «Домой» для взаимодействия с пользователем, не должно быть двух вещей для одной и той же функции (выход из приложения).

Binarian
источник
0

Выход из приложения другим способом, кроме кнопки «Домой», на самом деле не в стиле iOS .

Я сделал этого помощника, который не использует ничего личного:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

Но все равно не предназначен для производства в моем случае. Он предназначен для тестирования отчетов о сбоях или для быстрого перезапуска после сброса основных данных. Просто сделал безопасным, чтобы не быть отклоненным, если функция оставлена ​​в рабочем коде.

Джери Борбас
источник
0

Swift 4.2 (или старше)

Библиотека называется Darvinможет быть использована.

import Darwin

exit(0) // Here you go

Примечание: это не рекомендуется в приложениях iOS.

Делая это, вы получите журнал аварий.

Saranjith
источник
0

В iPadOS 13 теперь вы можете закрыть все сеансы сцены следующим образом:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

Это вызовет applicationWillTerminate(_ application: UIApplication)делегата вашего приложения и в конце концов завершит работу приложения.

Но остерегайтесь двух вещей:

Дополнительная информация о сценах в iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes

Клаас
источник
-1

Выход из приложения другим способом

Я сделал этого помощника, который не использует ничего личного:

Выход (0);

iOS.j
источник
-1

Может быть целесообразно выйти из приложения, если это долгоживущее приложение, которое также выполняется в фоновом режиме, например, для получения обновлений местоположения (с использованием обновлений местоположения фоновая возможность ).

Например, предположим, что пользователь выходит из приложения, основанного на местоположении, и переводит приложение в фоновый режим с помощью кнопки «Домой». В этом случае ваше приложение может продолжать работать, но может иметь смысл полностью выйти из него. Это было бы хорошо для пользователя (освобождает память и другие ресурсы, которые не нужно использовать), и хорошо для стабильности приложения (т. Е. Обеспечение возможности периодического перезапуска приложения, когда это возможно, является защитной сетью от утечек памяти и других недостатков памяти). вопросы).

Это может (хотя, вероятно, не следует, см. Ниже :-) быть достигнуто с помощью чего-то вроде:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

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

Тем не менее, было бы предпочтительнее использовать более стандартный подход, чтобы система знала, что приложение может быть остановлено. Например, в этом случае, убедившись, что GPS не используется, прекратив запрашивать обновления местоположения, включая отключение показа текущего местоположения на виде карты, если он есть. Таким образом, система позаботится о прекращении работы приложения через несколько минут (то есть [[UIApplication sharedApplication] backgroundTimeRemaining]) после того, как приложение войдет в фоновый режим. Это позволило бы получить все те же преимущества без использования кода для завершения работы приложения.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

И, конечно, использование exit(0)никогда не будет подходящим для обычного производственного приложения, которое работает на переднем плане, согласно другим ответам, которые ссылаются на http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

frankodwyer
источник