如何重置iPhone模拟器中的NSUserDefaults数据?

我已经添加NSUserDefault数据检索到我的应用程序,这是相当不错的。 但是为了testing,我想重置所有添加到默认数据库的数据,这样当用户第一次启动应用程序时,所有事情都处于这种状态。

我试图打电话给:

[NSUserDefaults resetStandardUserDefaults];

但是这没有做任何事情。 默认值仍然保存,可以检索。

最简单的方法是从模拟器中删除应用程序 – 就像你从真实的手机中删除应用程序,点击(点击)并保持,直到图标开始振动。 这将删除所有的应用程序数据,下一次从Xcode安装就像第一次。

如果您需要保留其他应用程序数据,则可以select一些选项。

一种方法是有一些debugging代码调用removeObjectForKey:在每个默认键上。

另一个是find安装模拟器副本的目录,并删除包含首选项的文件。 使用它来find应用程序:

ls -ld ~/Library/Application\ Support/iPhone\ Simulator/User/Applications/*/*.app 

应用程序的完整path将包含名称为UUID的目录。 在该目录中,查看“库/首选项”中的首选项文件。 删除,用户喜好都消失了。

你想要NSUserDefaults removePersistentDomainForName 。 这将删除应用程序的所有用户默认值:

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

有关NSUserDefaults类的更多信息,请参阅Apple文档 。

或者,如果您只关心iOS模拟器中的数据,则可以通过iOS模拟器>重置内容和设置来执行此操作

在这里输入图像说明

你可能会发现你已经“写”到userdefaults的应用程序都在一个文件里删除这个.plist文件的作品:

 user name/Library/Preferences/com.theAppYouAreHandling.plist 

实际上,这可能不适合所有情况,但由于我在模拟器中没有任何有价值的信息,所以我只是从模拟器本身的iPhone菜单中重置内容和设置。

在Swift 2.0中,以下1行将重置应用程序的所有NSUserDefaults:

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

直到xCode 6和iOS8模拟器plist文件的位置改变。

我在以下目录中find* .plist:

[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest.plist

手动删除path[1]中的文件,NSUserDefaults消失。

这里是迅捷版本:

 let domainName = NSBundle.mainBundle().bundleIdentifier! NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) 

在模拟器顶部菜单中:

 Simulator -> Reset Content and Settings... 

您可以使用NSUserDefaults类提供的removePersistentDomainForName方法。

句法 :

 - (void)removePersistentDomainForName:(NSString *)domainName 

例如:

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

如果你在unit testing中这样做,你可能希望在当前的模拟器中保持你的应用程序的状态,而不是在你每次运行你的unit testing的时候无意中擦掉它。 一种方法是在setUp()简单地保留您的应用程序域的旧值,然后在tearDown()恢复它们:

 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() } }