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


95

这听起来真的很新!我想检查是否是用户第二次进入我的应用程序,以便保持我正在使用的运行次数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上定位该应用


2
您是否尝试过在实际设备上进行测试?
亨利F

您需要在模拟器上手动清除它。这是怎么回事
dasblinkenlight 2014年

请标记正确的答案,以使这个问题不再答案
anders 2014年

1
@Reza:[[NSUserDefaults standardUserDefaults] setObject:selectedLists forKey:UserID]。我的应用程序在ios8中崩溃,尽管在ios6和ios7中工作正常。在这里,NSMutable数组中的selectedlistUserId是一个字符串。
曼森2014年

@Manthan这是一个不同的问题,但是我在其他地方也遇到了相同的问题,导致崩溃的原因是尽管我为某个键NSMutableArray保存的对象被另存为a NSArray并对其进行更改导致我的应用程序崩溃。 ..我建议您保存一个,NSArray并在以后使用时将其强制转换为NSMutableArrayusing [NSMutableArray arrayWithArray:array];。希望对您有所帮助。
Reza Shayestehpour 2014年

Answers:


169

我认为这是由于iOS8 Beta Simulator中的错误所致。

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

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

现在,一种快速而烦人的解决方案是单击iOS Simulator-> Reset Content and Settings。

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

我提交了一个错误报告


45
在iOS 8 GM上对其进行了测试,该错误仍然存​​在。很烦人。
曼弗雷德·史纳

1
我还可以在Xcode 6 GM模拟器和iOS 8(12A365)中确认这种错误行为!
鲍里斯·布达里奇(BorisBrdarić)2014年

1
想要跟踪此案的人的现有Open Radar链接:openradar.appspot.com/18540702
viggio24

1
似乎该错误已在更新到XCode 6.1(6A1052d)之后在SDK 8.1上修复-kas
-kad

2
对于面临相同问题的任何人。如果同一组下有多个应用程序,并且所有这些应用程序都在使用应用程序组(功能为ON),则必须从设备中删除所有应用程序,以便清除用户默认设置。由于用户默认设置是共享的,因此即使设备上有一个应用程序,也不会删除该应用程序,因为该应用程序将使用用户默认设置。
Ankit Srivastava,

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在该plist上执行“手术”(也许使用运行脚本构建阶段),例如

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


您缺少/ data / / * some_device_id * /之后的内容
,老兄

5

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

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

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


4

该代码在设备上应该可以正常工作。模拟器中可能存在一些错误。

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


1
重置“内容和设置”工作正常,并且我目前没有要检查的设备。tnx :)
Reza Shayestehpour 2014年

4

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

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

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模拟应用程序的首次运行,将其注释掉将模拟所有后续应用程序的执行。


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消失了。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.