我在我的应用程序中添加了NSUserDefaults
数据检索,这很好。但是为了测试,我想要重置添加到默认数据库中的所有数据,以便当用户第一次启动应用程序时,一切都处于初始状态。
我尝试调用:
[NSUserDefaults resetStandardUserDefaults];
但是那样没有任何作用。默认值仍然会被保存并且可以被检索。
我在我的应用程序中添加了NSUserDefaults
数据检索,这很好。但是为了测试,我想要重置添加到默认数据库中的所有数据,以便当用户第一次启动应用程序时,一切都处于初始状态。
我尝试调用:
[NSUserDefaults resetStandardUserDefaults];
但是那样没有任何作用。默认值仍然会被保存并且可以被检索。
您需要使用NSUserDefaults removePersistentDomainForName
。这将删除应用程序的所有用户默认设置:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
更多关于NSUserDefaults
类的信息,请参见Apple文档。NSUserDefaults(suiteName: "user_manager_remember_user_default")
为什么会出现这种情况? - Daniel Gomez Rico@"xctest"
作为 appDomain。 - yonix最简单的方法是从模拟器中移除应用-- 就像你从真实手机上移除应用一样,通过轻按(点击)并长按直到图标开始震动。这会删除所有应用数据,下次从Xcode安装时就像第一次安装一样。
如果您有其他需要保留的应用数据,可以选择几种方式。
一种方式是编写某些调试代码,在每个默认键上调用removeObjectForKey:
还有一种方法是查找安装了模拟器副本的目录,并删除包含首选项的文件。使用以下命令查找应用程序:
ls -ld ~/Library/Application\ Support/iPhone\ Simulator/User/Applications/*/*.app
你的应用程序完整路径中包含一个名称为 UUID 的目录。在该目录下,查找 Library/Preferences 目录以获取首选项文件。删除该文件,用户首选项将被删除。
NSUserDefaults
进行重置,具体请参考我的答案:https://dev59.com/0HNA5IYBdhLWcg3wmfEa#9672703。 - memmons您可能会发现,您为应用程序写入到用户默认设置中的所有内容都在一个文件中。删除这个 .plist 文件即可解决问题:
user name/Library/Preferences/com.theAppYouAreHandling.plist
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
实际上,这种方法可能并不适用于所有情况,但由于我在模拟器中没有存储任何有价值的信息,所以我只需从iPhone菜单中重置内容和设置,而无需退出模拟器。
在Xcode 6和iOS 8模拟器中,plist文件的位置发生了变化。
我在以下目录找到了*.plist文件:
[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest.plist
手动从路径[1]中删除该文件,即可删除NSUserDefaults。
let domainName = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName)
在模拟器的顶部菜单中:
Simulator -> Reset Content and Settings...
如果您正在进行单元测试,您可能希望将应用程序的状态保留在当前模拟器中,而不是每次运行单元测试时无意中清除它。一种方法是在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()
}
}
您可以在Finder
中找到UserDefaults,路径如下,删除.plist
文件。
~/Users/<USER>
/Library/Developer/CoreSimulator/Devices/<DEVICE_ID>
/data/Containers/Data/Application/<APP_ID>
/Library/Preferences/<APP_BUNDLE_ID>.plist
需要替换的路径组件:
1. <USER> = MAC user name
2. <DEVICE_ID> = Device/Simulator Identifier, e.g., 999271B8-FAA6-41DE-9864-4111F422ED12
3. <APP_ID> = Application identifier, e.g., 69928AEF-BCD5-413A-B06F-BC4A07080D62
4. <APP_BUNDLE_ID> = Your apps bundle identifier, e.g., com.company.appname.plist