Borrado de NSUserDefaults

votos
274

Estoy usando +[NSUserDefaults standardUserDefaults]para almacenar la configuración de la aplicación. Esto consiste en aproximadamente una docena de valores de cadena. ¿Es posible eliminar estos valores de forma permanente en lugar de simplemente establecerlos en un valor predeterminado?

Publicado el 13/02/2009 a las 08:49
fuente por usuario
En otros idiomas...                            


15 respuestas

votos
495

Se puede quitar el dominio persistente de la aplicación como esta:

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

En Swift 3 y posterior:

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

Esto es similar a la respuesta por @samvermette pero es un poco más limpia de la OMI.

Respondida el 26/07/2011 a las 03:55
fuente por usuario

votos
101

Este código se restablecen los valores predeterminados para el registro de dominio:

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

En otras palabras, removeObjectForKeypor cada clave única que jamás registrado en esa aplicación.

Créditos a Ken Thomases en este Apple Developer foros hilo.

Respondida el 10/06/2010 a las 05:40
fuente por usuario

votos
95

¿Intentó usar - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Respondida el 13/02/2009 a las 08:51
fuente por usuario

votos
29

Aquí está la respuesta en Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Respondida el 15/04/2015 a las 14:36
fuente por usuario

votos
27

Si lo necesita, mientras que el desarrollo, también puede restablecer el simulador, borrar todo el NSUserDefaults.

simulador de iOS -> Restablecer contenidos y ajustes ...

Tenga en cuenta que también se eliminarán todas las aplicaciones y archivos en el simulador.

Respondida el 06/09/2011 a las 15:54
fuente por usuario

votos
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Respondida el 20/01/2014 a las 04:56
fuente por usuario

votos
6

En Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Respondida el 18/08/2016 a las 07:36
fuente por usuario

votos
5

Me encanta extensiones cuando hacen el código más limpio:

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

        self.removePersistentDomainForName(domainName)
    }
}
Respondida el 22/08/2016 a las 19:33
fuente por usuario

votos
5

Nota: Esta respuesta ha sido actualizado para Swift también.

¿Qué hay de tenerlo en una línea?

La extensión de la respuesta @Christopher Rogers - la aceptada.

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

y sí, en algún momento puede que tenga que synchronizeella,

[[NSUserDefaults standardUserDefaults] synchronize];

He creado un método para hacer esto,

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

Swift ?

Con su veloz aún más fácil.

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

Y su uso :

UserDefaults.clean()
Respondida el 11/08/2015 a las 06:02
fuente por usuario

votos
5

Encontré esto:

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 "{}"

Fuente: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

Respondida el 04/12/2014 a las 18:33
fuente por usuario

votos
2

Es un error o lo que sea, pero el removePersistentDomainForNameno está funcionando mientras se borran todos los NSUserDefaultsvalores.

Por lo tanto, una mejor opción es que para restablecer el PersistentDomainy que se puede hacer a través de siguiente manera:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Respondida el 09/03/2016 a las 05:28
fuente por usuario

votos
1

Todas las respuestas anteriores son muy relevantes, pero si alguien todavía no ha podido restablecer los userdefaults para la aplicación eliminada, entonces se puede restablecer la configuración del contenido de simulador de que, y funcionará.introducir descripción de la imagen aquí

Respondida el 16/10/2014 a las 09:44
fuente por usuario

votos
1

Ampliando la respuesta de @ Folse ... Creo que una aplicación más correcta sería ...

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

... llamando de NSUserDefault persistentDomainForName: método. A medida que el estado de documentos, el método "Devuelve un diccionario que contiene las claves y valores en el dominio persistente especificado." Llamando dictionaryRepresentation: en cambio, devolverá un diccionario que probablemente incluirá otros ajustes, ya que se aplica a un ámbito más amplio.

Si necesita filtrar cualquiera de los valores que se van a restaurar, a continuación, iterar sobre las claves es la manera de hacerlo. Obviamente, si sólo quiere bombardear todas las Preferencias de la aplicación sin tener en cuenta, a continuación, uno de los otros métodos publicados anteriormente es el más eficiente.

Respondida el 18/02/2014 a las 02:42
fuente por usuario

votos
0

Prueba de esto, se está trabajando para mí.

Una sola línea de código

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Respondida el 01/03/2018 a las 02:57
fuente por usuario

votos
0

si el ajuste de aplicación que necesite restablecimiento se nsuserdefault para el acceso a micrófono (mi caso), una solución simple es la respuesta de Anthony McCormick ( Iphone - Cómo habilitar el acceso de la aplicación a los medios en el dispositivo - Código ALAssetsLibraryErrorDomain = -3,312 "Global negado el acceso" ).

en el dispositivo, vaya a Ajustes> General> Restablecer> Restablecer Advertencias sobre la ubicación

Respondida el 15/08/2014 a las 00:15
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more