Когда будет вызвано applicationWillTerminate?

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

Apple doc расплывчата в этом, она говорит только тогда, когда система должна по какой-то причине ее прекратить.

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

Ответ 1

Я только что исследовал этот вопрос (iOS 9.2). И у меня есть некоторые результаты.

Итак, applicationWillTerminate вызывается, когда пользователь закрывает приложение, не переключая его в фоновый режим: приложение активно, пользователь дважды нажимает на кнопку "Домой" и выбрасывает приложение.

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

Вы можете проверить это:

- (void)applicationWillTerminate:(UIApplication *)application {
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"term"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

а также

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"term"]){

        [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"term"];
        [[NSUserDefaults standardUserDefaults] synchronize];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"WORKED" message:@"term works" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        [alert show];

    }
...
return YES;

}

Ответ 2

Начиная с iOS 4, практический ответ - "никогда". (или, по крайней мере, "редко".) Вы не можете предполагать, что это когда-либо будет называться. Обычно случается, что ваше приложение перемещается в фоновый режим, когда пользователь нажимает кнопку "Домой", а затем через несколько секунд оно переходит в "приостановленное состояние" (все еще в памяти, но не получает никакого времени ЦП).

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

Когда вы отстранены, вы не получаете вызов applicationWillTerminate до того, как вас убьют. Вы должны предположить, что когда вы получите сообщение applicationDidEnterBackground: вы вскоре будете временно отстранены и умрете во время приостановки. Приведите свои дела в порядок (сохраните состояние приложения.)

В некоторых случаях вы все равно можете получать вызовы в applicationWillTerminate, но не следует полагать, что вы это сделаете.

Ответ 3

Завершение приложения в соответствии с Руководство по программированию приложений для iOS:

  • Приложения должны быть готовы к завершению в любое время и не должны ждать, чтобы сохранять данные пользователя или выполнять другие важные задачи.
  • Запуск, инициированный системой, является нормальной частью жизненного цикла приложения. Система обычно прекращает работу приложений, чтобы она могла восстановить память и освободить место для запуска других приложений пользователем, но система также может прекратить работу приложений, которые неправильно нарушают или не реагируют на события своевременно.
  • Приостановленные приложения не получают уведомления при их прекращении; система убивает процесс и восстанавливает соответствующую память.
  • Если приложение в настоящее время работает в фоновом режиме и не приостановлено, система вызывает applicationWillTerminate: своего делегата приложения до завершения.
  • Система не вызывается этим методом при перезагрузке устройства.
  • В дополнение к системе, завершающей ваше приложение, пользователь может явно закрыть приложение, используя интерфейс многозадачности. Термин, инициированный пользователем, имеет тот же эффект, что и прекращение действия приостановленного приложения. Процесс приложения убит и в приложение не отправлено уведомление.

Ответ 4

Когда пользователь открывает приложение, а затем нажимает кнопку "домой", iOS не закрывает приложение, а вместо этого приостанавливает его и помещает в фоновом режиме.

Тем не менее, устройства iOS имеют только 1 ГБ оперативной памяти (в основном), поэтому после открытия и закрытия нескольких приложений они начинают работать.

Теперь iOS должен вытолкнуть некоторые из этих приложений из RAM. Таким образом, он просыпается (при угадывании самого большого пользователя-плеера или самого старого используемого приложения) и сообщает ему, чтобы он сохранил все, что ему нужно, чтобы закрыть изящно.

Это, когда вызывается -applicationWillTerminate:. Когда iOS закрывает ваше приложение. Конечно, если вы заблокируете этот метод от слишком долгого возврата, iOS будет просто убивать ваше приложение в любом случае (в конце концов ему нужны ресурсы).

Если вы сохраняете все в -willResignActive: и -willEnterBackground:, вы можете просто игнорировать метод, и ваше приложение закроется после возврата метода.

РЕДАКТИРОВАТЬ: Если пользователь прикажет коммутатору приложений закрыть приложение, он также попытается изящно закрыть ваше приложение. Но если это ситуация, когда устройству требуется больше ресурсов, есть шанс, что вы не получите вызов -applicationWillTerminate:, так как у устройства не будет времени, поскольку ему могут потребоваться ресурсы быстрее, чем ваше приложение может быть сказано, чтобы изящно закрыть, Поэтому applicationWillTerminate: не может быть вызван.

Ответ 5

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

Вы можете использовать "didEnterBackground", который вызывается более надежным способом.

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

Ответ 6

AppWillTerminate() вызывается только тогда, когда:

  • Приложение активно на переднем плане, и пользователь нажимает кнопку "домой", он не отправляет приложение в фоновый режим, а делает его неактивным:

Используемые методы -

a) applicationWillResignActive() только

  1. В то время как приложение находится в неактивном режиме, пользователь проверяет, чтобы очистить приложение от ОЗУ:

Используемые методы -

a) applicationDidEnterBackground

b) applicationWillTerminate