我正在开发 Xcode 4.2.1 版和 iOS 5.0 中的项目。我想知道当您完全终止应用程序时会调用哪个函数,这意味着即使用户强制在后台运行的应用程序从主屏幕终止。我假设
(void)applicationWillTerminate:(UIApplication *)application
会被调用,但事实证明即使在后台终止应用程序后也没有调用它。我基本上想要做的是调用我在应用程序完全终止之前创建的方法,因此需要知道在应用程序结束时调用了哪个函数。
谢谢你。
“ applicationWillTerminate ”方法只有在应用程序被终止时没有处于挂起状态时才会被调用。
要理解这一点,考虑到当前您的应用程序处于前台活动状态,请查看以下两种情况:
案例1:当你单击主页按钮时,应用程序通过调用方法直接进入暂停状态 - (1) applicationWillResignActive 然后 (2) applicationDidEnterBackground。
现在,当您尝试退出/终止应用程序时,双击主页按钮,然后从最近的应用程序屏幕向上滑动当前应用程序屏幕,应用程序处于暂停状态。因此,“ applicationWillTerminate ”方法将不会被调用。
案例 2:当你双击Home 按钮时,应用程序通过调用方法进入非活动状态 - (1) applicationWillResignActive。
现在,当您尝试退出/终止应用程序时,通过从最近的应用程序屏幕向上滑动当前应用程序屏幕,应用程序在被终止时处于非活动状态(而不是暂停状态)。因此,将调用“ applicationWillTerminate ”方法。
有关此外观的更多信息 - Apple 关于 applicationWillTerminate(_:) 的官方文档
这是 iOS 4.0 及更高版本上的应用程序生命周期通知和委托消息的一个很好的概述。简而言之...
您的应用程序通常永远不会看到willTerminate,因为系统通常只会在您的应用程序已经暂停(在后台)时终止它。一旦您的应用程序被暂停,它就没有机会采取行动(*),因此没有回调。
didEnterBackground委托消息或通知应被视为您在可能终止之前清理或保存状态的最后机会。
(*) 好的,如果您的应用程序处于受支持的后台执行模式之一(例如音频、VoIP 或导航),则它可以执行某些操作,但在这种情况下,它要么尚未暂停,要么已通过条目取消暂停特定于该背景模式的点。
如果应用程序已经暂停,它将不会收到进一步的通知。留意didEnterBackground
通知。
此处的文档说明了这种情况的行为。
简而言之,只有applicationWillTerminate:
在应用程序正在运行时(无论是在前台还是在后台),当应用程序终止时,您才会收到该消息。因此,除非您的应用程序在前台或长期运行的后台模式之一(例如 VoIP、音频或由 指示的长期运行的任务beginBackgroundTaskWithExpirationHandler
)中运行,否则它将相当快地从background
状态转换到状态。suspended
在这种情况下,您将永远不会收到该applicationWillTerminate:
消息。
- (void)applicationWillTerminate:(UIApplication *)application
它在 UIApplicationDelegate 协议中。