NSUserDefaults не очищается после удаления приложения на симуляторе

это может показаться настоящим NOOB! Я хочу проверить, вошел ли он во второй раз, когда пользователь вводит мое приложение, поэтому для сохранения количества запусков я использую NSUserDefaults. Я применил следующий код в методе rootViewController viewDidLoad:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

все работает нормально, но проблема в том, что при удалении (удалении и повторной установке) приложения в соответствии с здесь и here данные должны быть очищены, но это не так, и после повторной установки приложения предыдущие данные все еще отображаются. Я запускаю свое приложение на iOS-симуляторе с помощью xCode6-бета и нацеливаю приложение на iOS 8

Ответ 1

Я думаю, что это связано с ошибкой в ​​бета-симуляторе iOS8.

Ожидаемое поведение заключается в том, что при удалении приложения NSUserDefaults для этого приложения также удаляются.

  • Однако NSUserDefaults НЕ удаляются при удалении приложения из симулятора.
  • Они удаляются при удалении с физического устройства под управлением iOS8.

Быстрое и раздражающее решение на данный момент - щелчок, iOS Simulator → Reset Содержание и настройки.

Xcode 9.2 с Simulator 10 все еще представляет эту проблему. Пункт меню теперь находится в разделе "Оборудование". Стереть все содержимое и настройки

Я отправил отчет об ошибке btw

Ответ 2

Так как Reset Содержимое и параметры являются ядерным вариантом, вы можете рассмотреть два других варианта, пока не будет исправлена ​​ошибка в симуляторе iOS 8/Xcode 6 GM:

  • Вы можете вручную удалить файл plist, где хранится NSUserDefaults. В настоящее время это находится в ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Немного утомительно, чтобы найти подходящий симулятор для работы с именами каталогов UUID. EDIT: 2014-10-28 20-34-52 Правильный путь: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  • Вы можете выполнить "операцию" на этом plist (возможно, используя фазу сборки script) с помощью plistbuddy, например

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

Ответ 3

Код должен хорошо работать на устройстве. Возможно, некоторые ошибки в симуляторе.

Попробуйте Reset Содержание и настройки для симулятора.

Ответ 4

это ошибка, и вы можете удалить NSUserDefaults с помощью следующего кода

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

Ответ 5

Хотя это еще ошибка, другой возможностью может быть удаление определенных ключей в NSUserDefaults. В большинстве случаев при тестировании/разработке мы заботимся только о нескольких ключах, а не в NSUserDefaults. Если вы беспокоитесь только о нескольких клавишах, я предлагаю добавить removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

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

Ответ 6

Для тех, кто сталкивается с одной и той же проблемой.

Если у вас более 1 приложения под одной и той же группой, и все они используют группы приложений (включены по возможностям), вам придется удалить все приложения с устройства, чтобы очистить пользовательские значения по умолчанию.

Поскольку пользовательские настройки по умолчанию являются общедоступными, даже если одно из приложений находится на устройстве, оно не будет удалено, так как это приложение будет использовать пользовательские коды.

Ответ 7

В моем случае я нашел *.plist в следующем каталоге:

[1]/Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest.plist

Проблема: Удаление приложения в xCode 6 (симулятор iOS 8), но файл остается на диске, как указано выше.

Решение: Удаление локального файла с пути [1] вручную, а NSUserDefaults исчезло.

Таким образом, раздражающий способ reset симулятора больше не нужен.