Jeg bruker +[NSUserDefaults standardUserDefaults]å lagre programinnstillinger. Denne består av omtrent et dusin strengverdier. Er det mulig å slette disse verdiene permanent i stedet for bare å sette dem til en standardverdi?
Fjerne NSUserDefaults
Du kan fjerne programmet vedvarende domene som dette:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
I Swift 3 og senere:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Dette ligner på svaret ved @samvermette men er litt renere IMO.
Denne koden tilbakestiller standard til registreringen domene:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Med andre ord, det removeObjectForKeyfor hver enkelt tast du noen gang er registrert i det programmet.
Kreditt til Ken Thomases på denne Apple Developer Forum tråd.
Visste du prøve å bruke - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Her er svaret i Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Hvis du trenger det samtidig utvikle, kan du også tilbakestille simulator, slette alt NSUserDefaults.
iOS Simulator -> Reset innhold og alle innstillinger ...
Husk at det også vil slette alle apps og filer på simulator.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
I Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Jeg elsker utvidelser når de gjøre koden renere:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Merk: Dette svaret har blitt oppdatert for Swift også.
Hva med å ha det på en linje?
Utvide @Christopher Rogers svaret - den aksepterte en.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
og ja, en gang må du kanskje synchronizedet,
[[NSUserDefaults standardUserDefaults] synchronize];
Jeg har laget en metode for å gjøre dette,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Med raske sin enda mer enkelt.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
Og bruk :
UserDefaults.clean()
Jeg fant dette:
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 "{}"
Kilde: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Det er en bug eller hva, men det removePersistentDomainForNamefungerer ikke mens clearing alle NSUserDefaultsverdier.
Så, er bedre alternativ som å nullstille PersistentDomain, og at du kan gjøre via følgende måte:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Alle ovennevnte svarene er svært relevant, men hvis noen fortsatt klarer å tilbakestille userdefaults for slettet app, så kan du tilbakestille innholdsinnstillingene for deg simulator, og det vil fungere.
Utvider på @ Folse svar ... Jeg tror en mer korrekt gjennomføring vil være ...
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];
}
... kaller NSUserDefault er persistentDomainForName: metode. Som docs staten, metoden "Returnerer en ordbok som inneholder nøkler og verdier i den angitte vedvarende domenet." Ringe dictionaryRepresentation: i stedet, vil returnere en ordbok som vil trolig omfatte andre innstillinger som det gjelder for et bredere omfang.
Hvis du trenger å filtrere ut noen av de verdiene som skal nullstilles, deretter gjentar nøklene er måten å gjøre det. Selvfølgelig, hvis du ønsker å bare nuke alle prefs for app uten hensyn, er da en av de andre metodene postet ovenfor den mest effektive.
Prøv dette, det fungerer for meg.
Eneste linje med kode
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
dersom søknaden innstillingen trenger reset er nsuserdefault for tilgang til mikrofonen (mitt tilfelle), er en enkel løsning svar fra Anthony McCormick ( iPhone - Slik aktiverer du applikasjonen tilgang til medier på enheten - ALAssetsLibraryErrorDomain Code = -3312 "Globalt nektet adgang" ).
på enheten, går du til Innstillinger> Generelt> Nullstill> Nullstill stedsadvarsler













