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?
Borrado de NSUserDefaults
fuente por usuario TonyNeallon
En otros idiomas...
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.
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.
¿Intentó usar - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Aquí está la respuesta en Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
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.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
En Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
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)
}
}
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()
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
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!)
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á.
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.
Prueba de esto, se está trabajando para mí.
Una sola línea de código
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
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