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

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

  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 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]; 

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

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

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

  • 但是,从模拟器中删除应用程序时, 不会删除NSUserDefaults。
  • 当您从运行iOS8的物理设备中删除它们时,它们将被正确删除。

现在一个快速和恼人的解决scheme是点击iOS模拟器 – >重置内容和设置

我提交了一个错误报告顺便说一句

由于重置内容和设置是一个核选项,因此您可以考虑另外两个选项,直到解决了iOS 8 / Xcode 6 GM模拟器上的错误:

  1. 您可以手动删除存储NSUserDefaults的plist文件。 当前位于~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist在UUID目录名称中find合适的模拟器来处理是件~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist编辑 :2014-10-28 20-34-52正确的path: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. 你可以使用plistbuddy来执行plist上的“手术”(也许使用一个脚本编译阶段)

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

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

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

这是一个错误,你可以用下面的代码删除NSUserDefaults

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

虽然这仍然是一个错误,但另一个选项可能是删除NSUserDefaults中的特定键。 大多数情况下,在testing/开发时,我们只关心几个键,而不是NSUserDefaults中的所有内容。 如果你只关心几个键比我build议添加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模拟应用程序的第一次运行,评论它将模拟所有后续的应用程序执行。

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

如果同一组下有超过1个应用程序,并且所有应用程序都使用应用程序组(在function下为ON),则必须从设备中删除所有应用程序,以便将用户默认设置清除。

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

在我的情况下,我发现* .plist在以下目录中:

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

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

解决scheme:手动删除path[1]中的文件,NSUserDefaults消失。

所以复位模拟器的烦人的方式不再是必要的。