【问题标题】:NSUserDefaults not cleared after app uninstall on simulator在模拟器上卸载应用程序后未清除 NSUserDefaults
【发布时间】:2014-09-19 02:01:55
【问题描述】:

这听起来可能很菜鸟!我想检查用户是否第二次进入我的应用程序,所以为了保持运行计数,我使用了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];

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

【问题讨论】:

  • 你试过在真机上测试吗?
  • 你需要在模拟器上手动清除。 Here is how.
  • 请标记正确的答案,这样这个问题就不再没有答案了
  • @Reza:[[NSUserDefaults standardUserDefaults]setObject:selectedLists forKey:UserID]。尽管在 ios6 和 ios7 中运行良好,但我的应用程序在 ios8 中崩溃了。 NSMutable Array 中的 selectedlistsUserId 是一个字符串。
  • @Manthan 这是一个不同的问题,但我在其他地方也遇到过同样的问题,导致崩溃的原因是虽然我为某个键保存的对象是 NSMutableArray 它是保存为NSArray 并更改它会使我的应用程序崩溃...我建议保存NSArray,当您以后想使用它时,使用[NSMutableArray arrayWithArray:array]; 将其转换为NSMutableArray。我希望这会有所帮助。

标签: ios ios-simulator nsuserdefaults ios8 xcode6


【解决方案1】:

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

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

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

目前一个快速而烦人的解决方案是单击 iOS 模拟器 -> 重置内容和设置。

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

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

【讨论】:

  • 在 iOS 8 GM 上测试过,bug 依然存在。很烦人。
  • 我还可以在 Xcode 6 GM 模拟器和 iOS 8 (12A365) 中确认这种错误行为!
  • 现有开放雷达链接供想要关注此案的人使用:openradar.appspot.com/18540702
  • 更新到 XCode 6.1 (6A1052d) 后,该错误似乎已在 SDK 8.1 上修复
  • 对于任何面临同样问题的人。如果您在同一组下有超过 1 个应用程序并且所有应用程序都在使用应用程序组(在功能下打开),那么您必须从设备中删除所有应用程序才能清除用户默认值。由于用户默认值是共享的,即使其中一个应用程序在设备上,也不会被删除,因为该应用程序将使用用户默认值。
【解决方案2】:

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

如果您在同一个组下有超过 1 个应用程序并且所有应用程序都在使用应用程序组(在功能下打开),那么您必须从设备中删除所有应用程序才能清除用户默认值。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      由于重置内容和设置是一个核心选​​项,您可以考虑其他两个选项,直到 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 在该 plist 上执行“手术”(可能使用运行脚本构建阶段),例如

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

      【讨论】:

      • 你在 /*some_device_id*/ 之后缺少 /data/
      【解决方案5】:

      就我而言,我在以下目录中找到了 *.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】:

        虽然这仍然是一个错误,但另一个选项可能是删除 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 模拟应用的第一次运行,将其注释掉将模拟所有后续应用的执行。

        【讨论】:

          【解决方案7】:

          代码应该可以在设备上正常运行。 可能是模拟器中的一些错误。

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

          【讨论】:

          • 重置内容和设置没问题,我目前没有设备可以检查。 tnx :)
          猜你喜欢
          • 2015-12-08
          • 2016-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-08
          相关资源
          最近更新 更多