Ik gebruik +[NSUserDefaults standardUserDefaults]om applicatie-instellingen op te slaan. Deze bestaat uit ongeveer tien stringwaarden. Is het mogelijk om deze waarden definitief verwijderen in plaats van alleen het instellen van hen om een standaard waarde?
clearing NSUserDefaults
bron van user TonyNeallon
In andere talen...
U kunt hardnekkige het domein van de applicatie te verwijderen als volgt uit:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
In Swift 3 en later:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Dit is vergelijkbaar met het antwoord van @samvermette maar is een beetje schoner IMO.
Deze code stelt de standaard de domeinregistratie:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Met andere woorden, removeObjectForKeyvoor elke toets die u ooit in die app geregistreerd.
Kredieten aan Ken Thomases op deze Apple Developer Forum thread.
Hebt u proberen met behulp - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Hier is het antwoord in Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Als je het nodig hebt, terwijl het ontwikkelen, kunt u ook opnieuw uw simulator, het verwijderen van alle NSUserDefaults.
iOS Simulator -> Reset inhoud en instellingen ...
Houd in gedachten dat het ook alle apps en bestanden te verwijderen op simulator.
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) }
Ik hou van extensions bij het maken van de code schoner:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Opmerking: Dit antwoord is bijgewerkt voor Swift ook.
Hoe zit het met om het op één lijn?
Uitbreiding van @Christopher Rogers antwoord - de aanvaarde één.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
en ja, soms moet u synchronizehet,
[[NSUserDefaults standardUserDefaults] synchronize];
Ik heb een methode om dit te doen geschapen,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Met swift haar nog makkelijker.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
En gebruik :
UserDefaults.clean()
Ik vond dit:
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 "{}"
Bron: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Het is een bug of wat dan ook, maar het removePersistentDomainForNamewerkt niet bij het wissen van alle NSUserDefaultswaarden.
Dus, een betere optie is dat de te resetten PersistentDomainen dat je kunt doen via de volgende wijze:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Alle bovenstaande antwoorden zijn zeer relevant, maar als iemand nog steeds niet in staat om de userdefaults opnieuw in te stellen voor verwijderde app, dan kunt u reset de inhoud instellingen van je simulator, en het zal werken.
Voortbouwend op antwoord @ Folse's ... Ik denk dat een meer correcte uitvoering zou zijn ...
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];
}
... belt NSUserDefault's persistentDomainForName: methode. Naarmate de documenten staat, de methode "Geeft een woordenboek met daarin de sleutels en waarden in het opgegeven hardnekkige domein." Bellen dictionaryRepresentation: in plaats daarvan, zal een woordenboek dat zal waarschijnlijk ook andere instellingen zoals dit geldt voor een ruimer toepassingsgebied terugkeren.
Als u nodig hebt om te filteren op basis van de waarden die moeten worden gereset, dan itereren over de toetsen is de manier om het te doen. Uiteraard, als je wilt gewoon allemaal van de prefs voor de app nuke zonder rekening te houden, dan is een van de andere methoden geplaatst boven het meest efficiënt is.
Probeer dit, het werkt voor mij.
Maar één regel code
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
indien de aanvraag instelling nodig reset nsuserdefault voor de toegang tot de microfoon (mijn geval), een eenvoudige oplossing is het antwoord van Anthony McCormick ( iPhone - applicatie toegang tot de media op het apparaat in te schakelen -? ALAssetsLibraryErrorDomain Code = -3312 "Global toegang geweigerd" ).
op het apparaat, gaat u naar Instellingen> Algemeen> Stel opnieuw in> Herstel locatiewaarschuwingen