ios - Limpando NSUserDefaults




objective-c cocoa-touch (10)

É um bug ou qualquer outra coisa, mas o removePersistentDomainForName não está funcionando enquanto limpa todos os valores de NSUserDefaults .

Então, a melhor opção é que para redefinir o PersistentDomain e que você pode fazer da seguinte maneira:

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

Estou usando +[NSUserDefaults standardUserDefaults] para armazenar as configurações do aplicativo. Isso consiste em aproximadamente uma dúzia de valores de string. É possível excluir esses valores permanentemente em vez de apenas configurá-los para um valor padrão?


Adoro extensões quando elas tornam o código mais limpo:

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

        self.removePersistentDomainForName(domainName)
    }
}

Em Swift:

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

Este código redefine os padrões para o domínio de registro:

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

Em outras palavras, removeObjectForKey para cada chave que você já registrou nesse aplicativo.

Créditos para Ken Thomases neste thread. fóruns da Apple Developer thread.


Expandindo a resposta do @ folse ... Acredito que uma implementação mais correta seria ...

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];
    }

... chamando persistentDomainForName: método do NSUserDefault. Como o estado docs, o método "Retorna um dicionário contendo as chaves e valores no domínio persistente especificado". Calling dictionaryRepresentation: em vez disso, retornará um dicionário que provavelmente incluirá outras configurações conforme se aplica a um escopo mais amplo.

Se você precisar filtrar qualquer um dos valores a serem redefinidos, iterar pelas teclas é a maneira de fazê-lo. Obviamente, se você quiser apenas eliminar todos os prefs para o aplicativo sem considerar, então um dos outros métodos postados acima é o mais eficiente.


Se precisar durante o desenvolvimento, você também pode redefinir seu simulador, excluindo todos os NSUserDefaults .

Simulador do iOS -> Redefinir conteúdo e configurações ...

Tenha em mente que ele também excluirá todos os aplicativos e arquivos no simulador.


Todas as respostas acima são muito relevantes, mas se alguém ainda não conseguir redefinir os padrões de usuário do aplicativo excluído, você poderá redefinir as configurações de conteúdo do seu simulador e ele funcionará.


Você pode remover o domínio persistente do aplicativo da seguinte forma:

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

No Swift 3 e posterior:

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

Isso é semelhante à resposta de @samvermette, mas é um IMO um pouco mais limpo.



Nota: Esta resposta foi atualizada para o Swift também.

Que tal tê-lo em uma linha?

Estendendo a resposta do @Christopher Rogers - o aceito.

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

e sim, em algum momento você pode precisar synchronize lo,

[[NSUserDefaults standardUserDefaults] synchronize];

Eu criei um método para fazer isso

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

Swift ?

Com swift é ainda mais fácil.

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

E uso :

UserDefaults.clean()




nsuserdefaults