回答:
次のように、アプリケーションの永続ドメインを削除できます。
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Swift 3以降の場合:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
これは@samvermetteの回答に似ていますが、IMOが少しすっきりしています。
このコードは、デフォルトを登録ドメインにリセットします。
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
つまり、removeObjectForKey
そのアプリでこれまでに登録したすべてのキーの1つです。
[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でも更新されています。
それを1行にするにはどうでしょうか?
@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:メソッドを呼び出します。ドキュメントにあるように、メソッドは「指定された永続ドメインのキーと値を含む辞書を返します」。dictionaryRepresentationを呼び出すと、代わりに、より広いスコープに適用されるため、他の設定が含まれている可能性が高い辞書が返されます。
リセットする値のいずれかをフィルターで除外する必要がある場合は、キーを反復することでそれを行うことができます。言うまでもなく、アプリのすべての設定を考慮せずに処理したい場合は、上記の他の方法のいずれかが最も効率的です。
リセットが必要なアプリケーション設定がマイク(私の場合)へのアクセスのnsuserdefaultである場合、簡単な解決策は、Anthony McCormick(Iphone-デバイス上のメディアへのアプリケーションアクセスを有効にする方法?-ALAssetsLibraryErrorDomain Code = -3312 "Global denied access"からの回答です。)。
デバイスで、「設定」>「一般」>「リセット」>「場所の警告をリセット」に移動します
これを試してください、それは私のために働いています。
1行のコード
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];