在模拟器上卸载应用程序后,NSUserDefaults未清除
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在模拟器上卸载应用程序后,NSUserDefaults未清除相关的知识,希望对你有一定的参考价值。
这可能听起来真的NOOB!我想检查是否是用户第二次进入我的应用程序,所以为了保持运行计数我正在使用NSUserDefaults
。我在rootViewController
的viewDidLoad
方法中实现了以下代码:
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];
一切正常,但问题是当我根据here和here卸载(删除并重新安装)应用程序时,应该清除数据,但事实并非如此,重新安装应用程序之前的数据仍然显示。我在ios模拟器上使用xCode6-beta运行我的应用程序,并在iOS 8上定位应用程序
我认为这是由于iOS8 Beta模拟器中的一个错误。
预期的行为是,当删除应用程序时,该应用程序的NSUserDefaults也会被删除。
- 但是,从模拟器中删除应用程序时,不会删除NSUserDefaults。
- 从运行iOS8的物理设备中删除它们时,它们会被正确删除。
一个快速而烦人的解决方案是点击,iOS模拟器 - >重置内容和设置。
带模拟器10的Xcode 9.2仍然存在这个问题。菜单选项现在是硬件..删除所有内容和设置
我提交了一个错误报告btw
由于重置内容和设置是核选项,因此您可以考虑另外两个选项,直到解决iOS 8 / Xcode 6 GM模拟器上的错误:
- 您可以手动删除存储
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
- 您可以使用plistbuddy对该plist执行“手术”(可能使用运行脚本构建阶段),例如
/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist
代码应该在设备上正常工作。也许是模拟器中的一些错误。
尝试重置模拟器的内容和设置。
这是一个错误,您可以使用以下代码删除NSUserDefaults
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
虽然这仍然是一个错误,但另一个选择可能是删除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
模拟应用程序的第一次运行,注释掉它将模拟所有后续的应用程序执行。
在我的情况下,我在以下目录中找到了* .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消失。
因此,不再需要重置模拟器的烦人方法。
对于任何面临同样问题的人。
如果同一组下有多个应用程序且所有应用程序正在使用应用程序组(功能下为ON),则必须从设备中删除所有应用程序才能清除用户默认值。
由于用户默认值是共享的,即使其中一个应用程序在设备上,也不会被删除,因为该应用程序将使用userdefaults。
以上是关于在模拟器上卸载应用程序后,NSUserDefaults未清除的主要内容,如果未能解决你的问题,请参考以下文章
Android studio下载后每次打开都要重新安装,在不用卸载的情况下怎么解决?