web-dev-qa-db-ja.com

NSUserDefaultsのクリア

+[NSUserDefaults standardUserDefaults]を使用してアプリケーション設定を保存しています。これは約12個の文字列値で構成されます。これらの値をデフォルト値に設定するだけでなく、永久に削除することは可能ですか?

281
TonyNeallon

次のようにして、アプリケーションの永続ドメインを削除できます。

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

Swift 3以降:

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

これは@samvermetteの回答に似ていますが、IMOが少しわかりやすくなっています。

506

このコードは、デフォルトを登録ドメインにリセットします。

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

つまり、そのアプリに登録したすべてのキーごとにremoveObjectForKeyです。

このApple開発者フォーラムでのKen Thomasesの功績 thread。

102
samvermette

-removeObjectForKeyを使用してみましたか?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
96
sbooth

Swiftの答えは次のとおりです。

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
30
juliensaad

開発中に必要な場合は、シミュレータをリセットして、すべてのNSUserDefaultsを削除することもできます。

iOSシミュレーター->コンテンツと設定をリセット...

シミュレーター上のすべてのアプリとファイルも削除されることに注意してください。

28
Roger Sanoli
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
14
folse

Swiftの場合:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
7
Adam Waite

コードをきれいにする拡張機能が大好きです。

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

        self.removePersistentDomainForName(domainName)
    }
}
5

注:この回答は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()
5
Hemang

私はこれを見つけました:

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

5

これはバグなど、すべてのremovePersistentDomainForName値をクリアしているときにNSUserDefaultsが機能していません。

したがって、より良いオプションは、PersistentDomainをリ​​セットし、次の方法で実行できることです。

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
2
Sohil R. Memon

上記の回答はすべて非常に関連性がありますが、削除されたアプリのユーザーデフォルトをリセットできない場合は、シミュレーターのコンテンツ設定をリセットできます。enter image description here

2
iDevAmit

@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:を呼び出すと、代わりに、より広い範囲に適用される他の設定を含む可能性が高い辞書が返されます。

リセットする値のいずれかを除外する必要がある場合は、キーを反復処理するのがその方法です。明らかに、アプリのすべての設定を無視してもよい場合は、上記の他の方法のいずれかが最も効率的です。

1
markeissler

これを試して、それは私のために働いています。

コードの単一行

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
0
Jaywant Khedkar

リセットが必要なアプリケーション設定がマイクにアクセスするためのnsuserdefaultである場合(私の場合)、アンソニー・マコーミックからの簡単な解決策です( Iphone-デバイス上のメディアへのアプリケーションアクセスを有効にする方法?-ALAssetsLibraryErrorDomain Code = -3312 "グローバル拒否アクセス」 )。

デバイスで、[設定]> [全般]> [リセット]> [場所の警告をリセット]に移動します

0
tmr