Używam +[NSUserDefaults standardUserDefaults]do przechowywania ustawień aplikacji. Ten składa się z wartości ciągu mniej więcej tuzin. Czy to możliwe, aby usunąć te wartości na stałe, a nie tylko ich ustawienia do wartości domyślnych?
NSUserDefaults rozliczeniowe
Można usunąć uporczywe domenę aplikacji tak:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
W Swift 3 i później:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Jest to podobne do odpowiedzi przez @samvermette ale jest trochę czystsze IMO.
Ten kod resetuje ustawienia domyślne do rejestracji domeny:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Innymi słowy, removeObjectForKeydla każdego pojedynczego klawisza kiedykolwiek zarejestrowana w tej aplikacji.
Kredyty Ken Tomaszom na tej firmy Apple Forum Twórca wątku.
Czy spróbować użyć - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Oto odpowiedź w Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Jeśli jest to potrzebne przy opracowywaniu, można również zresetować symulator, usuwanie wszystkich NSUserDefaults.
iOS Simulator -> Reset zawartość i ustawienia ...
Należy pamiętać, że będzie to również usunąć wszystkie aplikacje i pliki na symulatorze.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
W Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Kocham rozszerzeń kiedy dokonać czyszczenia kodu:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Uwaga: Ta odpowiedź została zaktualizowana do Swift też.
Co mieć go w jednej linii?
Rozszerzanie @Christopher Rogers odpowiedź - akceptowany jeden.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
i tak, kiedyś może trzeba synchronizenim,
[[NSUserDefaults standardUserDefaults] synchronize];
Utworzyłem sposób, aby to zrobić,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Z Swift jej jeszcze bardziej proste.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
I użytkowanie :
UserDefaults.clean()
Znalazłem to:
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 "{}"
Źródło: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Jest to bug czy cokolwiek, ale removePersistentDomainForNamenie działa podczas usuwania wszystkich NSUserDefaultswartości.
Tak, lepszym rozwiązaniem jest to, aby zresetować PersistentDomaini że można to zrobić poprzez następujący sposób:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Wszystkie powyższe odpowiedzi są bardzo istotne, ale jeśli ktoś jeszcze w stanie zresetować userdefaults dla usuniętej aplikacji, można przywrócić ustawienia zawartości ciebie symulator, i będzie działać.
Rozwijając na odpowiedź @ folse za ... Wierzę bardziej prawidłowa realizacja byłaby ...
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];
}
... nazywając NSUserDefault za persistentDomainForName: metody. Jako stan Dokumenty, metoda „Zwraca słownik zawierający klucze i wartości w określonym uporczywego domeny.” Wywołanie dictionaryRepresentation: zamiast, powróci do słownika, który prawdopodobnie będzie zawierać inne ustawienia, ponieważ odnosi się do szerszego zakresu.
Jeśli trzeba odfiltrować żadnej z wartości, które mają być kasowane, a następnie iteracji nad klawiszami jest sposób aby to zrobić. Oczywiście, jeśli chcesz po prostu nuke wszystkich preferencjach dla aplikacji niezależnie, wówczas jeden z pozostałych metod zamieszczonych powyżej jest najbardziej efektywne.
Spróbuj to, to działa na mnie.
Pojedyncza linia kodu
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Jeśli ustawienie aplikacji wymagających resetu jest nsuserdefault dostępu do mikrofonu (moim przypadku), prostym rozwiązaniem jest odpowiedź od Anthony McCormick ( iPhone - Jak umożliwić dostęp aplikacji do mediów na urządzeniu - Kodeks ALAssetsLibraryErrorDomain = -3312 „Global odmowa dostępu” ).
na urządzeniu, przejdź do Ustawienia> Ogólne> Wyzeruj> Położenie Ostrzeżenia













