Answers:
您可以这样删除应用程序的持久域:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
在Swift 3及更高版本中:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
这与@samvermette的答案类似,但更干净一些。
此代码将默认值重置为注册域:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
换句话说,它 removeObjectForKey
针对您在该应用中注册的每个按键。
[NSUserDefaults resetStandardUserDefaults]
不这样做超出我的范围。
您是否尝试过使用-removeObjectForKey
吗?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
这是Swift中的答案:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
单线
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
注意:此答案也已针对Swift进行了更新。
将其放在一行上该怎么办?
扩展@Christopher Rogers的答案–已被接受。
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
是的,有时候您可能需synchronize
要这样做,
[[NSUserDefaults standardUserDefaults] synchronize];
我已经创建了一种方法来做到这一点,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
迅速?
迅速,甚至更容易。
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
和用法:
UserDefaults.clean()
我喜欢扩展使代码更简洁的扩展:
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()
}
}
我找到了这个:
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
这是一个错误或其他问题,但是removePersistentDomainForName
在清除所有NSUserDefaults
值时不起作用。
因此,更好的选择是重置PersistentDomain
,您可以通过以下方式进行操作:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
扩展@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:方法。docs指出,方法“返回包含指定持久域中的键和值的字典”。调用dictionaryRepresentation:将会返回一个字典,该字典可能会包含其他设置,因为它适用于更广泛的范围。
如果您需要过滤掉任何将要重置的值,那么遍历键就是这样做的方法。显然,如果您只想无视应用程序的所有偏好,那么上面发布的其他方法之一就是最有效的。
如果需要重置的应用程序设置为nsuserdefault(用于访问麦克风)(我的情况),一个简单的解决方案是Anthony McCormick的回答(Iphone-如何启用应用程序对设备上媒体的访问权限?-ALAssetsLibraryErrorDomain代码= -3312“全局拒绝访问”)。
在设备上,转到“设置”>“常规”>“重置”>“重置位置警告”
试试这个,对我有用。
单行代码
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];