applicationWillTerminate什么时候被调用,什么时候没有

嗨,我已经阅读了关于应用程序的几个问题将终止调用,而不是叫。

我想总结一下我的理解,因为有几个职位的发言不同。

  1. 对于IOS(没有多任务),当主页button被按下时,它总是被调用。

  2. 对于iOS 4及以上版本

    一个。 当按下homebutton时不会调用它(当应用程序移动到背景时)

    湾 它从多任务dockerclosures应用程序时被调用,如果应用程序在info.plist中有一个突然终止标志,则禁用,否则它不会被调用。 (我设置“应用程序应该得到应用程序死亡事件”,甚至在closures应用程序从多任务docker终止function没有被调用)

基于这个,我有几个问题

设置应用程序应该获取应用程序死亡事件标志是否是一个好习惯? (我设置“应用程序应该得到应用程序死亡事件”,甚至在closures应用程序从多任务docker终止function没有被调用)

要么

注册“UIApplicationWillTerminateNotification”比info.plist设置更好吗?

基本上我只需要在应用程序终止时做一些工作,而不是在移动到后台时。

要么

编辑(1):当应用程序被终止时,以下内容被发送到APP。 我如何捕捉它?

程序接收信号:“SIGKILL”。

编辑(2):

请注意:从多任务处理docker卸载时,它不会在iOS 4及更高版本中被调用。 你可能会认为这是。 但在我看来,这不是。

我问是否有人知道为什么? 还有什么我失踪了。

另外注意我设置“应用程序应该得到应用程序死亡事件”,即使这样,它不会被调用。

编辑(3):

以下问题的答案也没有奏效。 applicationWillTerminate不会被调用

有人和我面临类似的问题吗?

简而言之,除非您的UIApplicationExitsOnSuspend中的UIApplicationExitsOnSuspend设置为YES,否则在iOS4及更高版本中,不保证applicationWillTerminate:将被调用。

正如文档所述 :

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

(强调我的)

如果您需要在应用程序退出前执行某些操作,则需要在applicationDidEnterBackground:执行此操作。 没有办法赶上SIGKILL。

我看到-applicationWillTerminate:使用以下testing进行调用。 在一个新的项目中(我使用了“单一视图应用程序”模板),将以下内容添加到AppDelegate中:

 - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"%s", __PRETTY_FUNCTION__); __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ if (identifier != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:identifier]; identifier = UIBackgroundTaskInvalid; } }]; dispatch_async(dispatch_get_main_queue(), ^{ for (int i=0; i < 20; i++) { NSLog(@"%d", i); sleep(1); } if (identifier != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:identifier]; identifier = UIBackgroundTaskInvalid; } }); } - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"%s", __PRETTY_FUNCTION__); } 

这个例子将在应用程序进入后台时开始后台任务。 这个任务只需要20秒的延迟(每秒logging一次),让应用程序在后台运行(注意在后台运行和暂停运行之间的差异),足以让它从应用程序切换器中消失。

所以,要testing它,运行应用程序,点击主页button发送应用程序到后台,然后在20秒延迟之前,从应用程序切换器中删除应用程序。 在20年代末之后,应用程序将会调用-applicationWillTerminate: 您可以在Xcode中观看控制台来validation是否属于这种情况。

我在iOS模拟器的iOS 5.1和6.1(两个iPhone)都试过这个,看到它发生在这两种情况下。 我也在运行iOS 6.1.2的iPhone 4S上testing,看到了相同的行为。

资料来源: http : //www.cocos2d-iphone.org/forum/topic/7386

我将我的状态保存代码从applicationWillTerminate复制到applicationDidEnterBackground,并添加了一个multitaskingEnabled布尔值,以便我只在applicationDidEnterBackground中调用状态保存。 因为在多任务设备上有一个applicationWillTerminate被调用的实例:如果应用程序在前台并closures设备。 在这种情况下,applicationDidEnterBackground和applicationWillTerminate都会被调用。

据我所知,有3种情况会导致你的应用程序死亡。

  1. terminal用户终止,你可以在-[UIApplication applicationWillEnterBackground:]做一些事情,在这种情况下, -[UIApplication applicationWillTerminate:]将不会被调用。

  2. 如系统丢失,如内存不够,可以在-[UIApplication applicationWillTerminate:]做一些事情,在这种情况下,我们不知道applicationWillEnterBackground:是否被调用过;

  3. 坠毁,除了使用某种崩溃报告工具,什么都不能做。 (编辑:捕捉SIGKILL是不可能的)

正如我们所知道的,当应用程序被调用时,应用程序只有5秒。 所以如果有人想在这一点更新服务器。 比使用同步呼叫。

 [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error]; 

注意: -applicationWillTerminate将不会调用如果应用程序正处于暂停状态。 暂停状态意味着应用程序在backgroupd中没有任何工作。 其中一个解决scheme是使用后台任务。

//绝对答案applicationWillTerminate

func applicationWillTerminate(application:UIApplication){

  print("applicatoinWillTerminate") // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } 

第1步:command + shift + h(双击(tab))

第2步:移动应用程序顶端(杀)

第3步:applicationWillTerminate工作