How can I reset the NSUserDefaults data in the iPhone simulator?
我已经在我的应用程序中添加了
我尝试致电:
1 | [NSUserDefaults resetStandardUserDefaults]; |
但是什么也没做。默认值仍会保存并可以检索。
您想要
1 2 | NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; |
有关
或者,如果您只关心iOS模拟器中的数据,则可以通过" iOS模拟器">"重置内容和设置"来实现。
最简单的方法是从模拟器中删除该应用程序-就像您将其从真实手机中删除一样,方法是点击(单击)并按住直到图标开始振动。这将删除所有应用程序数据,下次您从Xcode安装时,就像第一次一样。
如果您需要保留其他应用数据,则有两种选择。
一种方法是在每个默认键上都有一些调用removeObjectForKey:的调试代码。
另一种方法是找到模拟器副本的安装目录,然后删除包含首选项的文件。使用它来查找应用程序:
1 | ls -ld ~/Library/Application\\ Support/iPhone\\ Simulator/User/Applications/*/*.app |
应用程序的完整路径将包含名称为UUID的目录。在该目录中,在"库/首选项"中查找首选项文件。删除它,然后用户首选项消失。
在Swift 2.0中,以下1行将重置应用程序的所有NSUserDefaults:
您可能会发现您已经"写\\"到应用程序的用户默认值都在文件中
删除此.plist文件有效:
1 | user name/Library/Preferences/com.theAppYouAreHandling.plist |
实际上,这可能并非在每种情况下都适用,但是由于我没有在模拟器中保留任何有价值的信息,因此我只是从iPhone菜单中的模拟器自身内部重置"内容和设置"。
直到Xcode 6和iOS 8 Simulator plist文件的位置已更改。
我在以下目录中找到了* .plist:
[1] /用户/ SOME-USERNAME /库/开发人员/ CoreSimulator /设备/ SOME-DEVICE-ID /数据/库/首选项/SP.UserDefaultsTest.plist
手动从路径[1]删除找到的文件,并且NSUserDefaults消失了。
这里是快速版本:
1 2 | let domainName = NSBundle.mainBundle().bundleIdentifier! NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) |
在模拟器顶部菜单中:
1 | Simulator -> Reset Content and Settings... |
如果您是在单元测试中进行此操作,则可能希望将应用程序的状态保留在当前模拟器中,而不是每次运行单元测试时都无意间将其擦除。一种方法是简单地保留
中还原它们。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class MyClass_Tests: XCTestCase { static let domainName = Bundle.main.bundleIdentifier! static var oldUserDefaults: [String : Any]? override class func setUp() { super.setUp() // Hang onto this so we don't inadvertently wipe the app's state while running tests. oldUserDefaults = UserDefaults.standard.persistentDomain(forName: domainName) } override class func tearDown() { // Restore the old values. UserDefaults.standard.setPersistentDomain(oldUserDefaults!, forName: domainName) super.tearDown() } override func setUp() { super.setUp() // Wipe the state for each test. UserDefaults.standard.removePersistentDomain(forName: MyClass_Tests.domainName) } override func tearDown() { super.tearDown() } } |
您可以使用NSUserDefaults类提供的removePersistentDomainForName方法。
语法:
1 | - (void)removePersistentDomainForName:(NSString *)domainName |
示例:
1 2 | NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId]; |