5

NSUserDefault当我的应用在 iOS 中完全退出时,我需要保存我的。不是didenterbackgroundforeground。仅当用户在 iOS 中使用减号 (-) 登录我的应用程序时。

所以我applicationWillTerminateAppDelegate.

- (void)applicationWillTerminate:(UIApplication *)application
{

    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"iCloud"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

但它不保存到NSUserDefault.

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

4

4 回答 4

3

来自苹果文档

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

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

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

我担心,没有任何委托方法可以很好地处理应用程序的强制场景。

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

于 2013-09-22T07:15:42.243 回答
2

当应用程序从多任务栏结束时,它会被简单地杀死。没有调用委托方法。willTerminate当点击主页按钮时,为不支持多任务处理的应用程序调用。

默认情况下,应用程序支持多任务处理,因此您应该在 didEnterBackground 中做所有您需要做的事情。在那之后,你不能保证你的任何代码都会被再次调用。

于 2013-09-22T07:25:06.257 回答
2

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

在此处输入图像描述

于 2013-09-22T07:31:01.767 回答
1

The problem is that applicationWillTerminate is not getting called at all.

Change your applicationDidEnterBackground as below and kill your application within 20 seconds. You can see applicationWillTerminate getting called & setting your iCloud value properly in 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;
        }
    });
}
于 2013-09-22T07:17:12.267 回答