+[NSUserDefaults standardUserDefaults]
を使用してアプリケーション設定を保存しています。これは約12個の文字列値で構成されます。これらの値をデフォルト値に設定するだけでなく、永久に削除することは可能ですか?
次のようにして、アプリケーションの永続ドメインを削除できます。
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
です。
このApple開発者フォーラムでのKen Thomasesの功績 thread。
-removeObjectForKey
を使用してみましたか?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Swiftの答えは次のとおりです。
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
開発中に必要な場合は、シミュレータをリセットして、すべてのNSUserDefaults
を削除することもできます。
iOSシミュレーター->コンテンツと設定をリセット...
シミュレーター上のすべてのアプリとファイルも削除されることに注意してください。
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Swiftの場合:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
コードをきれいにする拡張機能が大好きです。
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
注:この回答は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];
}
Swift?
Swiftを使用すると、さらに簡単になります。
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
および使用法:
UserDefaults.clean()
私はこれを見つけました:
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:を呼び出すと、代わりに、より広い範囲に適用される他の設定を含む可能性が高い辞書が返されます。
リセットする値のいずれかを除外する必要がある場合は、キーを反復処理するのがその方法です。明らかに、アプリのすべての設定を無視してもよい場合は、上記の他の方法のいずれかが最も効率的です。
これを試して、それは私のために働いています。
コードの単一行
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
リセットが必要なアプリケーション設定がマイクにアクセスするためのnsuserdefaultである場合(私の場合)、アンソニー・マコーミックからの簡単な解決策です( Iphone-デバイス上のメディアへのアプリケーションアクセスを有効にする方法?-ALAssetsLibraryErrorDomain Code = -3312 "グローバル拒否アクセス」 )。
デバイスで、[設定]> [全般]> [リセット]> [場所の警告をリセット]に移動します