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

56

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

我尝试调用:

[NSUserDefaults resetStandardUserDefaults];

但是那样没有任何作用。默认值仍然会被保存并且可以被检索。


1
这个问题在这里也有答案:https://dev59.com/0Ww15IYBdhLWcg3w1_YN - Matt
11个回答

108

您需要使用NSUserDefaults removePersistentDomainForName。这将删除应用程序的所有用户默认设置:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
更多关于NSUserDefaults类的信息,请参见Apple文档
或者,如果你只关心iOS模拟器中的数据,可以通过iOS模拟器 > 重置内容和设置来实现。 enter image description here

3
如果我使用套件名称获取用户默认设置却无法删除,为什么会这样?NSUserDefaults(suiteName: "user_manager_remember_user_default") 为什么会出现这种情况? - Daniel Gomez Rico
1
@danielgomezrico 你需要使用你的suiteName作为appDomain来删除具有套件名称的用户默认值。 - stevo.mit
这在单元测试中不起作用。对我有效的是只传递 @"xctest" 作为 appDomain。 - yonix

55

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

如果您有其他需要保留的应用数据,可以选择几种方式。

一种方式是编写某些调试代码,在每个默认键上调用removeObjectForKey:

还有一种方法是查找安装了模拟器副本的目录,并删除包含首选项的文件。使用以下命令查找应用程序:

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

你的应用程序完整路径中包含一个名称为 UUID 的目录。在该目录下,查找 Library/Preferences 目录以获取首选项文件。删除该文件,用户首选项将被删除。


2
对于初学者,该路径中的目录名称中的空格需要使用反斜杠空格进行转义。这让我卡了一分钟,因此我想提醒一下。 - willc2
6
不知道为什么这篇文章会得到那么多赞。从模拟器中删除应用程序是一种"核选项",在大多数情况下并不实用,例如在自动化测试中,你希望能够多次运行测试而无需每次重新安装应用程序。你可以使用NSUserDefaults进行重置,具体请参考我的答案:https://dev59.com/0HNA5IYBdhLWcg3wmfEa#9672703。 - memmons

7

您可能会发现,您为应用程序写入到用户默认设置中的所有内容都在一个文件中。删除这个 .plist 文件即可解决问题:

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

对于我在 Xamarin.Mac 项目中,删除 .plist 文件后,只有在重启后才应用默认值。 - Maxim V. Pavlov

7
在Swift 2.0中,以下1行代码将重置应用程序的所有NSUserDefaults: NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

5

实际上,这种方法可能并不适用于所有情况,但由于我在模拟器中没有存储任何有价值的信息,所以我只需从iPhone菜单中重置内容和设置,而无需退出模拟器。


3

在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。


3
这是Swift版本:

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

2

在模拟器的顶部菜单中:

Simulator -> Reset Content and Settings...

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

0

您可以在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接