292

+[NSUserDefaults standardUserDefaults]用来存储应用程序设置。这由大约十几个字符串值组成。是否可以永久删除这些值,而不仅仅是将它们设置为默认值?

4

15 回答 15

522

您可以像这样删除应用程序的持久域:

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

在 Swift 3 及更高版本中:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

这与@samvermette 的答案相似,但更干净一点。

于 2011-07-26T02:55:23.017 回答
103

此代码将默认值重置为注册域:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

换句话说,它removeObjectForKey适用于您在该应用程序中注册的每一个键。

在此 Apple 开发者论坛主题中感谢 Ken Thomases

于 2010-06-10T04:40:08.447 回答
97

您是否尝试使用 - removeObjectForKey

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
于 2009-02-13T07:51:56.653 回答
30

这是 Swift 中的答案:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
于 2015-04-15T14:36:31.483 回答
29

如果你在开发过程中需要它,你也可以重置你的模拟器,删除所有的NSUserDefaults.

iOS 模拟器 -> 重置内容和设置...

请记住,它还将删除模拟器上的所有应用程序和文件。

于 2011-09-06T14:54:11.693 回答
15
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
于 2014-01-20T03:56:32.257 回答
7

在斯威夫特:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
于 2016-08-18T10:36:08.037 回答
7

当它们使代码更清晰时,我喜欢扩展:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

斯威夫特 5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}
于 2016-08-22T22:33:40.937 回答
6

注意:这个答案也已针对 Swift 进行了更新。

将它放在一条线上怎么样?

扩展@Christopher Rogers 的答案——被接受的答案。

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

是的,有时你可能需要synchronize它,

[[NSUserDefaults standardUserDefaults] synchronize];

我已经创建了一个方法来做到这一点,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

斯威夫特

使用 swift 它更容易。

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

和用法

UserDefaults.clean()
于 2015-08-11T06:02:53.333 回答
5

我找到了这个:

osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"

来源:https ://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

于 2014-12-04T18:33:16.600 回答
2

以上所有答案都非常相关,但如果有人仍然无法重置已删除应用的用户默认设置,那么您可以重置模拟器的内容设置,它会起作用。在此处输入图像描述

于 2014-10-16T08:44:45.780 回答
2

这是一个错误或其他问题,但在清除所有值removePersistentDomainForName时不起作用。NSUserDefaults

因此,更好的选择是重置PersistentDomain并且您可以通过以下方式进行操作:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
于 2016-03-09T08:28:05.430 回答
1

扩展@folse的答案...我相信更正确的实现将是...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

...调用 NSUserDefault 的 persistentDomainForName: 方法。正如文档所述,该方法“返回包含指定持久域中的键和值的字典”。相反,调用 dictionaryRepresentation: 将返回一个字典,该字典可能包含其他设置,因为它适用于更广泛的范围。

如果您需要过滤掉任何要重置的值,那么遍历键是一种方法。显然,如果您只想删除应用程序的所有首选项而不考虑,那么上面发布的其他方法之一是最有效的。

于 2014-02-18T01:42:55.813 回答
0

如果需要重置的应用程序设置是 nsuserdefault 以访问麦克风(我的情况),一个简单的解决方案是 Anthony McCormick 的回答(Iphone - 如何启用应用程序访问设备上的媒体? - ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")。

在设备上,转到设置>常规>重置>重置位置警告

于 2014-08-14T23:15:20.577 回答
0

试试这个,它对我有用。

单行代码

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
于 2018-03-01T05:57:31.223 回答