我已经NSUserDefaults
在我的应用程序中添加了数据检索,这非常好。但是为了测试,我想重置我添加到默认数据库中的所有数据,以便用户第一次启动应用程序时一切都处于状态。
我试着打电话:
[NSUserDefaults resetStandardUserDefaults];
但这无济于事。默认值仍然被保存并且可以被检索。
我已经NSUserDefaults
在我的应用程序中添加了数据检索,这非常好。但是为了测试,我想重置我添加到默认数据库中的所有数据,以便用户第一次启动应用程序时一切都处于状态。
我试着打电话:
[NSUserDefaults resetStandardUserDefaults];
但这无济于事。默认值仍然被保存并且可以被检索。
你想要NSUserDefaults removePersistentDomainForName
。这将删除应用程序的所有用户默认值:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
有关NSUserDefaults
该类的更多信息,请参阅Apple 文档。
或者,如果您只关心 iOS 模拟器中的数据,您可以通过iOS Simulator > Reset Content and Settings来完成。
最简单的方法是从模拟器中删除应用程序 - 就像您从真实手机中删除它一样,通过点击(单击)并按住直到图标开始振动。这会删除所有应用程序数据,下次从 Xcode 安装时就像第一次一样。
如果您有其他需要保留的应用程序数据,您有几个选择。
一种方法是在每个默认键上都有一些调用 removeObjectForKey: 的调试代码。
另一种是找到安装模拟器副本的目录,并删除包含首选项的文件。使用它来查找应用程序:
ls -ld ~/Library/Application\ Support/iPhone\ Simulator/User/Applications/*/*.app
您的应用程序的完整路径将包含名称为 UUID 的目录。在该目录中,在 Library/Preferences 中查找首选项文件。删除它,用户偏好就消失了。
您可能会发现您为应用程序“写入”到 userdefaults 的内容都在文件中删除此 .plist 文件有效:
user name/Library/Preferences/com.theAppYouAreHandling.plist
在 Swift 2.0 中,以下 1 行将重置应用程序的所有 NSUserDefaults:
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
实际上,这可能并不适用于所有情况,但由于我在模拟器中没有保留任何有价值的信息,所以我只是从模拟器本身的 iPhone 菜单中重置内容和设置。
直到 Xcode 6 和 iOS 8 Simulator 更改了 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...
您可以使用NSUserDefaults 类提供的removePersistentDomainForName方法。
句法 :
- (void)removePersistentDomainForName:(NSString *)domainName
例子 :
NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId];
如果您在单元测试中执行此操作,您可能希望将应用程序的状态保留在当前模拟器中,而不是在每次运行单元测试时无意中擦除它。一种方法是简单地保留应用程序域的旧值,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()
}
}
您可以在以下路径中找到 UserDefaults Finder
,删除.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