在iOS上终止我的应用程序时,保存NSUserDefaults的正确方法是什么?

当我的应用程序在iOS中完全退出时,我需要保存NSUserDefault 。 不didenterbackgroundforeground 。 只有当用户在iOS中用减( – )符号杀了我的应用程序。

所以我在AppDelegate applicationWillTerminate中编写下面的代码。

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

但它不保存到NSUserDefault

那么我应该在哪里写保存我的数据?

从Apple Doc :

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

applicationWillTerminate没有必要在应用程序退出时调用,当您的应用程序支持后台执行时, 可能不会调用它

您可以使用UIApplicationExitsOnSuspend指定该应用程序应该被终止,而不是在退出时移动到后台。

我担心,没有任何委托方式可以很好地处理应用程序的使用情况。

希望这可以帮助你解决你的问题。

当一个应用程序从多任务栏中结束时,简单地被杀死。 没有委托方法调用。 willTerminate被称为应用程序不支持多任务当主页button被击中。

应用程序默认支持多任务,所以你应该做你需要做的所有事情在didEnterBackground。 之后,你不能保证你的代码将被再次调用。

你可以在你的info.plist文件中设置你的Application does not run in background" = "YES" ,你可以看到applicationWillTerminate委托在NSUserDefaults调用和存储值。

在这里输入图像说明

问题是applicationWillTerminate没有被调用。

如下所示更改您的applicationDidEnterBackground并在20秒内杀死您的应用程序。 您可以在NSUserDefaults看到applicationWillTerminate正确调用&设置iCloud

 - (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; } }); }