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

问题描述 投票:91回答:7

这可能听起来真的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];

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

ios ios-simulator nsuserdefaults ios8 xcode6
7个回答
164
投票

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

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

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

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

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

我提交了一个错误报告btw


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


4
投票

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

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


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/core simulator/devices/some-device-ID/data/library/preferences/SP.user defaults test.普利司通

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

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

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


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.