54

我已经NSUserDefaults在我的应用程序中添加了数据检索,这非常好。但是为了测试,我想重置我添加到默认数据库中的所有数据,以便用户第一次启动应用程序时一切都处于状态。

我试着打电话:

[NSUserDefaults resetStandardUserDefaults];

但这无济于事。默认值仍然被保存并且可以被检索。

4

11 回答 11

104

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

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

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

或者,如果您只关心 iOS 模拟器中的数据,您可以通过iOS Simulator > Reset Content and Settings来完成。

在此处输入图像描述

于 2012-03-12T18:29:08.873 回答
53

最简单的方法是从模拟器中删除应用程序 - 就像您从真实手机中删除它一样,通过点击(单击)并按住直到图标开始振动。这会删除所有应用程序数据,下次从 Xcode 安装时就像第一次一样。

如果您有其他需要保留的应用程序数据,您有几个选择。

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

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

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

您的应用程序的完整路径将包含名称为 UUID 的目录。在该目录中,在 Library/Preferences 中查找首选项文件。删除它,用户偏好就消失了。

于 2009-05-22T16:02:27.947 回答
7

您可能会发现您为应用程序“写入”到 userdefaults 的内容都在文件中删除此 .plist 文件有效:

user name/Library/Preferences/com.theAppYouAreHandling.plist
于 2012-05-09T05:25:34.270 回答
7

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

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

于 2015-10-16T12:44:49.023 回答
5

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

于 2009-05-22T22:00:48.037 回答
4

直到 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 消失了。

于 2014-10-16T11:48:54.317 回答
3

这是快速版本:

let domainName = NSBundle.mainBundle().bundleIdentifier!       
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName)
于 2015-10-03T06:45:31.333 回答
2

在模拟器顶部菜单中:

Simulator -> Reset Content and Settings...
于 2017-05-28T17:42:43.863 回答
0

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

句法 :

- (void)removePersistentDomainForName:(NSString *)domainName

例子 :

NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId];
于 2014-10-01T11:28:31.577 回答
0

如果您在单元测试中执行此操作,您可能希望将应用程序的状态保留在当前模拟器中,而不是在每次运行单元测试时无意中擦除它。一种方法是简单地保留应用程序域的旧值,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()
    }
}
于 2017-07-08T04:53:44.977 回答
0

您可以在以下路径中找到 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
于 2021-09-13T14:19:07.780 回答