在模拟器上卸载应用程序后,NSUserDefaults未清除

时间:2014-07-27 21:26:14

标签: ios ios-simulator nsuserdefaults ios8 xcode6

这可能听起来真的是NOOB!我想检查这是否是用户第二次进入我的应用程序,因此要保持运行计数我正在使用NSUserDefaults。我已在rootViewController的{​​{1}}方法中实现了以下代码:

viewDidLoad

一切正常,但问题是当我根据herehere卸载(删除并重新安装)应用程序时,应该清除数据,但不是 - 安装应用程序以前的数据仍然显示。 我在iOS模拟器上使用xCode6-beta运行我的应用程序,并在iOS 8上定位应用程序

7 个答案:

答案 0 :(得分:164)

我认为这是由于iOS8 Beta模拟器中的一个错误。

预期的行为是,当删除应用时,该应用的NSUserDefaults也会被删除。

  • 但是,从模拟器中删除应用时,NSUserDefaults NOT 已删除。
  • 从运行iOS8的物理设备中删除它们时,它们会被正确删除。

现在快速而恼人的解决方案是点击,iOS模拟器 - >重置内容和设置。

Xcode 9.2 with Simulator 10仍然存在这个问题。菜单选项现在是硬件..删除所有内容和设置

我提交了一个错误报告btw

答案 1 :(得分:14)

由于重置内容和设置是核选项,因此在解决iOS 8 / Xcode 6 GM模拟器上的错误之前,您可以考虑其他两个选项:

  1. 您可以手动删除存储NSUserDefaults的plist文件。目前位于~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist,找到适合UUID目录名称的模拟器有点繁琐。 编辑:2014-10-28 20-34-52正确路径: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. 你可以进行"手术"使用plistbuddy例如

  3. 在该plist上(可能使用运行脚本构建阶段)

    /usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

答案 2 :(得分:4)

代码应该在设备上正常工作。 也许是模拟器中的一些错误。

尝试重置模拟器的内容和设置。

答案 3 :(得分:4)

这是一个错误,您可以使用以下代码删除NSUserDefaults

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

答案 4 :(得分:2)

虽然这仍然是一个错误,但另一个选择可能是删除NSUserDefaults中的特定密钥。大多数情况下,在测试/开发时,我们只关心几个键而不是NSUserDefaults中的所有内容。如果您只关心几个键而不是我建议添加removeObjectForKey

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

添加removeObjectForKey模拟应用的第一次运行,对其进行评论将模拟所有后续应用的执行。

答案 5 :(得分:2)

在我的情况下,我在以下目录中找到了* .plist:

[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest的.plist

问题:在xCode 6(iOS 8模拟器)中删除应用,但文件仍保留在磁盘上,如上所述。

解决方案:手动删除路径[1]中找到的文件,NSUserDefaults已消失。

因此,不再需要重置模拟器的烦人方法。

答案 6 :(得分:2)

对于任何面临同样问题的人。

如果您在同一组下有多个应用程序并且所有应用程序正在使用应用程序组(功能下为ON),则您必须从设备中删除所有应用程序才能清除用户默认值。

由于用户默认值是共享的,即使其中一个应用程序在设备上,也不会被删除,因为该应用程序将使用用户默认设置。