关于ios:如何在iPhone模拟器中重置NSUserDefaults数据?

How can I reset the NSUserDefaults data in the iPhone simulator?

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

我尝试致电:

1
[NSUserDefaults resetStandardUserDefaults];

但是什么也没做。默认值仍会保存并可以检索。


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

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

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

或者,如果您只关心iOS模拟器中的数据,则可以通过" iOS模拟器">"重置内容和设置"来实现。

enter


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

如果您需要保留其他应用数据,则有两种选择。

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

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

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

应用程序的完整路径将包含名称为UUID的目录。在该目录中,在"库/首选项"中查找首选项文件。删除它,然后用户首选项消失。


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

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


您可能会发现您已经"写\\"到应用程序的用户默认值都在文件中
删除此.plist文件有效:

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


实际上,这可能并非在每种情况下都适用,但是由于我没有在模拟器中保留任何有价值的信息,因此我只是从iPhone菜单中的模拟器自身内部重置"内容和设置"。


直到Xcode 6和iOS 8 Simulator plist文件的位置已更改。

我在以下目录中找到了* .plist:

[1] /用户/ SOME-USERNAME /库/开发人员/ CoreSimulator /设备/ SOME-DEVICE-ID /数据/库/首选项/SP.UserDefaultsTest.plist

手动从路径[1]删除找到的文件,并且NSUserDefaults消失了。


这里是快速版本:

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

在模拟器顶部菜单中:

1
Simulator -> Reset Content and Settings...

如果您是在单元测试中进行此操作,则可能希望将应用程序的状态保留在当前模拟器中,而不是每次运行单元测试时都无意间将其擦除。一种方法是简单地保留setUp()中应用程序域的旧值,然后在tearDown()

中还原它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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()
    }
}

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

语法:

1
- (void)removePersistentDomainForName:(NSString *)domainName

示例:

1
2
NSString *strAppBundleId = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:strAppBundleId];