Очистка NSUserDefaults

Я использую +[NSUserDefaults standardUserDefaults] для хранения настроек приложения. Это состоит из примерно дюжины строковых значений. Можно ли постоянно удалять эти значения, а не устанавливать их по умолчанию?

Ответ 1

Вы можете удалить постоянный домен приложения следующим образом:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

В Swift 3 и более поздних версиях:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

Это похоже на ответ by @samvermette, но немного более чистый IMO.

Ответ 2

Этот код сбрасывает значения по умолчанию в домен регистрации:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

Другими словами, он removeObjectForKey для каждого отдельного ключа, который вы когда-либо регистрировали в этом приложении.

Кредиты для Ken Thomases на форумах разработчиков Apple thread.

Ответ 3

Вы пытались использовать - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];

Ответ 4

Вот ответ в Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)

Ответ 5

Если вам это нужно при разработке, вы можете также reset ваш симулятор, удалив все NSUserDefaults.

iOS Simulator → reset Содержание и настройки...

Имейте в виду, что он также удалит все приложения и файлы на симуляторе.

Ответ 6

NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

Ответ 7

В Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }

Ответ 9

Примечание. Этот ответ также был обновлен для 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?

С swift это еще проще.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

И использование:

UserDefaults.clean()

Ответ 10

Мне нравятся расширения, когда они делают код чище:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

Ответ 11

Все вышеприведенные ответы очень актуальны, но если кто-то еще не может reset отключить пользователя для удаленных приложений, то вы можете reset настройки содержимого вашего симулятора, и он будет работать. enter image description here

Ответ 12

Это ошибка или что-то еще, но removePersistentDomainForName не работает при очистке всех значений NSUserDefaults.

Итак, лучший вариант - это reset PersistentDomain, и вы можете сделать это следующим образом:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)

Ответ 13

Расширение ответа @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];
    }

... вызов NSUserDefault persistentDomainForName: метод. Как указано в документах, метод "Возвращает словарь, содержащий ключи и значения в указанном постоянном домене". Вызов словаряRepresentation: вместо этого вернет словарь, который, вероятно, будет включать другие настройки, поскольку он применяется к более широкой области.

Если вам нужно отфильтровать любые значения, которые должны быть reset, то повторение этих ключей - это способ сделать это. Очевидно, что если вы хотите без всяких ограничений использовать все привилегии для приложения, то один из других методов, описанных выше, является наиболее эффективным.

Ответ 14

если параметр приложения, требующий reset, является nsuserdefault для доступа к микрофону (мой случай), простое решение - ответ от Энтони Маккормика (Iphone - Как включить доступ к приложениям для мультимедиа на устройстве? - ALAssetsLibraryErrorDomain Code = -3312 "Глобальный запрещенный доступ" .

на устройстве, откройте "Настройки" > "Основные" > Reset > Сбросить предупреждения о местоположении

Ответ 15

Попробуйте, это работает для меня.

Одна строка кода

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];