Я использую +[NSUserDefaults standardUserDefaults]для хранения настроек приложения. Она состоит из примерно дюжины строковых значений. Можно ли удалить эти значения постоянно вместо того , чтобы просто установив их значения по умолчанию?
Устранение NSUserDefaults
Вы можете удалить упорный домен приложения, как это:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
В Swift 3 и позже:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Это похоже на ответ по @samvermette, но немного чище IMO.
Этот код сбрасывает по умолчанию в области регистрации:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Другими словами, removeObjectForKeyдля каждого ключа , который вы когда - либо зарегистрированного в этом приложении.
Кредиты Кен Томасов на этой компании Apple для разработчиков Форумы нить.
Пробовали ли вы используете - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Вот ответ на Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Если вам это нужно, а развивающиеся, вы можете восстановить свой тренажер, удаление всех NSUserDefaults .
IOS Simulator -> Сброс контента и настроек ...
Имейте в виду, что это также удалит все приложения и файлы на тренажере.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
В Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Я люблю расширение, когда они делают уборщик кода:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Примечание: Этот ответ был обновлен для Swift тоже.
Как насчет иметь в одной строке?
Расширение @Christopher Rogers ответ - принял один.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
и да, иногда вам может понадобиться synchronizeэто,
[[NSUserDefaults standardUserDefaults] synchronize];
Я создал метод, чтобы сделать это,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
С быстрым его еще более легким.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
И использование :
UserDefaults.clean()
Я нашел это:
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 "{}"
Источник: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Это ошибка или что - то , но removePersistentDomainForNameне работает, очищая все NSUserDefaultsзначения.
Таким образом, лучше вариант заключается в том , чтобы сбросить PersistentDomainи что вы можете сделать с помощью следующим образом:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Все вышеперечисленные ответы очень важны, но если кто-то еще не в состоянии сбросить userdefaults для удаленного приложения, то вы можете сбросить настройки содержимого вашего имитатора, и он будет работать.
Расширение на ответ @ Folse ... Я считаю, что правильнее было бы осуществление ...
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];
}
... называя persistentDomainForName NSUserDefault в: метод. Поскольку состояние Документов, метод «Возвращает словарь, содержащий ключи и значение в указанной персистирующей домене.» Вызов dictionaryRepresentation: вместо этого, возвращает словарь, который, вероятно, включать в себя другие параметры, как он относится к более широкому охвату.
Если вам нужно отфильтровать любые значения, которые должны быть сброшены, то итерация по клавишам является способ сделать это. Очевидно, что если вы хотите просто сбросить атомную бомбу на все преф для приложения без учета, а затем один из других методов, размещенных выше, является наиболее эффективной.
Попробуйте это, он работает для меня.
Одна строка кода
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
если установка приложения необходимости сброса nsuserdefault для доступа к микрофону (мой случай), простое решение является ответом от Энтони McCormick ( Iphone - Как разрешить доступ приложения к средствам массовой информации на устройстве - ALAssetsLibraryErrorDomain Code = -3312 «Global отказано в доступе» ).
на устройстве, перейдите в раздел Настройки> Общие> Сброс> Сбросить предупр













