Программная очистка базы данных NSUserDefaults между удалением/переустановкой приложения

Цель:

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

Обратите внимание, что удаленная и повторно установленная версия могут иметь один и тот же номер сборки/версии.

Контекст:

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

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

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

После того, как эталонные данные будут установлены (загружены), это еще не конец истории, так как будут существовать новые исправления, и на основе их метки времени мне нужно будет определить, игнорировать ли их или выполнять импорт стиля «обновление или создание».

Исследованные подходы:

  1. Замены UDID. В этом сообщении объясняется, как можно создать собственную замену UDID. В приведенном контексте тот факт, что это значение может измениться при удалении, рассматривается как минус. Хотя, в моем контексте, это было бы положительно. Затем я мог бы вложить все свои ключи, специфичные для установки, в словарь с этим уникальным идентификатором. Однако, если приложение установлено на устройстве с хотя бы еще одним приложением от того же разработчика, уникальный идентификатор будет сохраняться в цикле удаления/переустановки.
  2. Обнаружение повторной установки после удаления. На это я не нашел готового ответа. Есть ли более общий способ для приложения определить, что оно только что установлено, отличая это от повторной установки после удаления?

Подходы, которые я, вероятно, буду использовать:

  • Я понимаю, что NSUserDefaults по умолчанию предназначены для долгой жизни, и поэтому, вероятно, мне придется построить некоторую собственную логику, чтобы обнаружить этот сценарий.
  • Since I am using Core Data, I will likely create an entity that stores these reference data timestamps, instead of using NSUserDefaults. This way, a fresh empty database is a giveaway that all reference data needs a fresh load.
    • I am toying with building a more generic JSON-->Core Data importer that I could use across apps with similar reference data needs. Thus, I was hoping to avoid tying things to a Core Data instance and leveraging NSUserDefaults.
  • После этапа разработки я буду упаковывать базу данных SQLite и копировать ее на место вместо импорта плоских файлов в базу данных.

person idStar    schedule 26.09.2014    source источник


Ответы (2)


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

Если вы хотите, чтобы значения сохранялись между установками приложения, вы можете использовать KeyChain.

person Rami    schedule 26.09.2014
comment
Если вы установите приложение в симуляторе, удалите его, а затем переустановите, вы обнаружите, что NSUserDefaults на самом деле все еще присутствуют. Это именно то, что случилось со мной, и я решил найти другую стратегию. - person idStar; 27.09.2014
comment
Это ошибка симулятора в xcode 6, такого быть не должно. Чтобы иметь возможность очистить симулятор, вам придется сбросить контент для симулятора (что очень неудобно). Но если вы попробуете это на устройстве, этого не произойдет. - person Rami; 29.09.2014

Вместо использования NSUserDefaults приложение может просто читать/записывать свой собственный файл со списком свойств, который будет удален при удалении.

Мы можем сохранить метку времени в этом списке свойств для первого запуска, чтобы приложение могло определить, когда была применена эта текущая установка. Тот же ключ в базе данных NSUserDefaults будет представлять собой первую установку приложения. Два похожих, но разных бита информации.

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

Кроме того: описание проблемы, безусловно, помогает прояснить проблему в собственном уме!

person idStar    schedule 26.09.2014