在iOS上终止我的应用程序时,保存NSUserDefaults的正确方法是什么?
当我的应用程序在iOS中完全退出时,我需要保存NSUserDefault
。 不didenterbackground
和foreground
。 只有当用户在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; } }); }