NSUserDefaults initWithSuiteName сохраняется после удаления приложения

У меня проблема: если я храню данные с помощью [[NSUserDefaults alloc] initWithSuiteName:SUITE_NAME]], данные сохраняются даже после удаления приложения. Это должно произойти?

Ответы

Ответ 1

Это должно произойти. Фактически это цель initWithSuiteName, чтобы обмениваться данными между всеми приложениями в группе приложений. Документы говорят:

Используйте этот метод в таких сценариях, как:

  • При разработке пакета приложений, обмена предпочтениями или другими данными среди приложения

  • При разработке расширения приложения, для обмена предпочтениями или другими данными между расширением и содержащим приложение

Невозможно удалить приложение, поскольку при удалении приложения он не уведомляется. Это та же проблема с хранением элементов в Keychain - они сохраняются за пределами жизни приложения. Это может быть хорошим или плохим, в зависимости от потребностей вашего приложения.

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

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

Ответ 2

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

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

Например:

let defaults = NSUserDefaults.standardUserDefaults()
if !defaults.boolForKey("firstInstallComplete") {
    let sharedSuite = NSUserDefaults(suiteName: "com.example.app.shared")!

    // delete whatever keys you want
    sharedSuite.removeObjectForKey("example")
    sharedSuite.removeObjectForKey("another")
    ...
    sharedSuite.synchronize()

    defaults.setBool(true, forKey: "firstInstallComplete")
    defaults.synchronize()
}