如何重置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...
“removePersistentDomainForName:”做你想做的?
您可以使用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() } }