Sto usando +[NSUserDefaults standardUserDefaults]per memorizzare le impostazioni dell'applicazione. Questo consiste di valori stringa circa una dozzina. E 'possibile eliminare questi valori in modo permanente e non solo loro impostazione ad un valore di default?
NSUserDefaults di compensazione
fonte dall'utente TonyNeallon
In altre lingue...
È possibile rimuovere dominio persistente della domanda come questa:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
In Swift 3 e versioni successive:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Questo è simile alla risposta da @samvermette, ma è un po 'più pulito IMO.
Questo codice ripristina le impostazioni predefinite per il dominio di registrazione:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
In altre parole, removeObjectForKeyper ogni singolo tasto è mai registrato in tale applicazione.
Crediti a Ken Tommaso su questo sviluppatore forum di Apple filo.
Hai provato con - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Ecco la risposta a Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Se ne avete bisogno durante lo sviluppo, è anche possibile ripristinare il simulatore, l'eliminazione di tutte le NSUserDefaults.
iOS Simulator -> Ripristina contenuto e impostazioni ...
Tenete a mente che sarà anche eliminare tutte le applicazioni ei file sul simulatore.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
In Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Amo le estensioni quando fanno il codice più pulito:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Nota: Questa risposta è stata aggiornata per Swift troppo.
Che dire di averlo su una linea?
Estendere @Christopher Rogers risposta - quella accettata.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
e sì, a volte potrebbe essere necessario synchronizeesso,
[[NSUserDefaults standardUserDefaults] synchronize];
Ho creato un metodo per fare questo,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Con la rapida è ancora più facile.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
E il loro utilizzo :
UserDefaults.clean()
Ho trovato questo:
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 "{}"
Fonte: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Si tratta di un bug o qualsiasi altra cosa, ma il removePersistentDomainForNamenon funziona durante la rimozione di tutti i NSUserDefaultsvalori.
Così, l'opzione migliore è quella di ripristinare la PersistentDomaine che si può fare via seguente modo:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Tutte le risposte di cui sopra sono molto rilevanti, ma se qualcuno ancora in grado di ripristinare le userdefaults per app cancellato, quindi è possibile ripristinare le impostazioni del contenuto di voi simulatore, e funzionerà.
Ampliando la risposta di @ Folse ... Credo che una più corretta applicazione sarebbe ...
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];
}
... chiamando persistentDomainForName di NSUserDefault: metodo. Come lo stato docs, il metodo del "Restituisce un dizionario contenente le chiavi ei valori nel dominio persistente specificato." Chiamata dictionaryRepresentation: invece, restituirà un dizionario che probabilmente includerà altre impostazioni come si applica a un ambito più ampio.
Se avete bisogno di filtrare uno dei valori che devono essere reimpostare, quindi l'iterazione delle chiavi è il modo per farlo. Ovviamente, se si vuole bombardare solo tutte le preferenze per l'applicazione senza tenere conto, allora uno degli altri metodi postato sopra è il più efficiente.
Try This, sta funzionando per me.
Una riga di codice
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
se l'impostazione dell'applicazione che necessitano di ripristino è nsuserdefault per l'accesso al microfono (il mio caso), una soluzione semplice è la risposta da Anthony McCormick ( Iphone - Come abilitare l'accesso alle applicazioni per i media sul dispositivo -? Codice ALAssetsLibraryErrorDomain = -3312 "Global negato l'accesso" ).
sul dispositivo, vai a Impostazioni> Generali> Ripristina> Ripristina avvisi posizione