当我的应用在iOS中完全退出时,我需要保存NSUserDefault
。
不是didenterbackground
和foreground
。
仅当用户在iOS中使用减号( - )符号终止我的应用时。
所以我在applicationWillTerminate
的{{1}}中写下以下代码。
AppDelegate
但它不会保存到- (void)applicationWillTerminate:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"iCloud"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
。
那么我应该在哪里写保存我的数据?
答案 0 :(得分:2)
来自Apple Doc:
适用于不支持后台执行或已关联的应用 对于iOS 3.x或更早版本,此方法始终在用户时调用 退出应用程序。对于支持后台执行的应用程序,此方法 通常不会在用户退出应用程序时调用,因为该应用程序 在这种情况下简单地移动到背景。但是,这种方法可能 在应用程序在后台运行的情况下调用 (未暂停)系统需要因某种原因终止它。
当您的应用退出时,applicationWillTerminate
没有必要被调用,当您的应用支持后台执行时,可能无法调用。
您可以使用UIApplicationExitsOnSuspend指定应该终止该应用,而不是在退出时将其移至后台。
我担心,没有任何委托方法会狡猾地处理应用程序的力量 - 非常情况。
希望这可以帮助您解决问题。
答案 1 :(得分:2)
当应用程序从多任务栏结束时,就会被杀死。没有调用委托方法。当主页按钮被点击时,对于不支持多任务处理的应用程序调用{{1}}。
默认情况下,应用程序支持多任务处理,因此您应该在didEnterBackground中执行所有操作。之后,您无法保证将再次调用您的任何代码。
答案 2 :(得分:2)
您可以在info.plist文件中设置Application does not run in background" = "YES"
,然后可以看到applicationWillTerminate
委托被调用&将值存储在NSUserDefaults
。
答案 3 :(得分:1)
问题在于applicationWillTerminate
根本没有被调用。
如下所示更改applicationDidEnterBackground
并在20秒内终止您的应用程序。
你可以看到applicationWillTerminate
被叫&在iCloud
NSUserDefaults
值
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__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;
}
});
}