什么时候会调用applicationWillTerminate?

在什么情况下应用程序将终止调用? 例如,如果代码崩溃,会不会被调用呢?

苹果公司的doc在这个上是含糊不清的,只是说系统因为某种原因需要终止它。

对于不支持后台执行的应用程序或与iOS 3.x或更低版本链接的应用程序,当用户退出应用程序时,总是调用此方法。 对于支持后台执行的应用程序,当用户退出应用程序时,通常不会调用此方法,因为在此情况下应用程序只是移动到后台。 但是,这种方法可能会在应用程序在后台运行(未挂起),系统因某种原因需要终止的情况下调用。

我刚刚探讨了这个问题(iOS 9.2)。 我有一些结果。 所以,applicationWillTerminate被称为当用户终止应用程序,而不切换应用程序到后台模式:应用程序处于活动状态,用户双击主页button,并抛出应用程序。 但。 如果用户首先将应用程序切换到背景,并且在此之后尝试终止应用程序,则不会调用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; 

}

从iOS 4开始,实际答案是“从不”。 你不能认为它会被称为。 通常会发生的事情是,当用户按下主页button时,您的应用程序会移到后台,然后在将来某个时间系统决定将其终止。 当你在后台,你不会得到这个电话。 你应该假设,当你得到一个applicationDidEnterBackground:消息,你将在后台死亡。 按顺序获取您的事务(保存应用程序状态)

在某些情况下,您仍然可以打电话给您的应用程序,但是您不应该认为您会这么做。

应用程序终止根据应用程序的iOS编程指南 :

  • 应用程序必须随时准备终止,而不应等到保存用户数据或执行其他关键任务。
  • 系统启动的终止是应用程序生命周期的正常部分。 系统通常会终止应用程序,以便可以回收内存并为用户启动的其他应用程序腾出空间,但是系统也可能会终止错误行为或不及时响应事件的应用程序。
  • 暂停的应用程序在终止时不会收到通知; 系统杀死进程并回收相应的内存。
  • 如果某个应用程序当前正在后台运行而未挂起,系统将在终止之前调用其应用程序委托的applicationWillTerminate :。
  • 设备重新启动时,系统不会调用此方法。
  • 除了系统终止您的应用程序,用户可以使用多任务UI来显式终止您的应用程序。 用户启动的终止与终止暂停的应用程序具有相同的效果。 应用程序的进程被终止,并没有通知发送到应用程序。

当用户打开应用程序,然后按主页buttoniOS不closures应用程序,而是暂停它,并把它放在后台。

然而,iOS设备只有1GB的RAM(大部分),所以打开和closures几个应用程序后,他们开始用尽。

iOS现在必须从ram中踢出一些应用程序。 所以它醒了(猜测最大的内存用户,或最旧的应用程序)一个应用程序,并告诉它保存任何需要优雅地closures。

那就是-applicationWillTerminate:被调用的时候。 当iOSclosures你的应用程序。 当然,如果你阻止这个方法返回太久,那么iOS就会杀死你的应用(毕竟它需要资源)。

如果您将所有内容保存在-willResignActive:-willEnterBackground:那么您几乎可以忽略该方法,并且在方法返回后您的应用程序将closures。

编辑:如果用户告诉应用程序切换器closures应用程序,它也将尝试优雅地closures你的应用程序。 但是,如果这种情况下设备需要更多的资源,有一个机会,你不会得到-applicationWillTerminate:调用,因为设备将没有时间,因为它可能需要的资源比你的应用程序可以被告知优雅地closures。 所以applicationWillTerminate:不保证被调用。

我认为当用户从前台杀死应用程序或者当操作系统自己执行时,会调用它。 剩下的时间只是一个很大的“可能”。 我通常不会因为那个“可能”而依赖那个。

您可以使用以更可靠方式调用的“didEnterBackground”

你也可以尝试创build一个崩溃的目的,看看它是如何反应(从前景和背景崩溃)。

仅在以下情况下调用AppWillTerminate():

  1. 应用程序在前台处于活动状态,用户按下主页button,它不会将应用程序发送到后台,而是使其处于非活动状态:

被称为 –

a)仅applicationWillResignActive()

  1. 当应用程序处于不活动模式时,用户向上滑动以清除RAM中的应用程序:

被称为 –

一)applicationDidEnterBackground

b)applicationWillTerminate