Папка кэшей очищена (очищена/очищена) автоматически на iOS

У меня есть приложение, которое позволяет загружать "модули", которые могут расширить использование вашего приложения.
Когда пользователь загружает модуль, я извлекаю ZIP файл с сервера и извлекаю его в свою папку Caches. (Каждый из этих почтовых индексов может быть размером от 60 до 2 МБ).

К сожалению, доступны более 300 модулей, и многие пользователи загружают по меньшей мере 50-60 из них на свое устройство.

В последнее время у меня появилось много жалоб, что модули просто исчезают с пользовательского устройства, поэтому я провел некоторое расследование и наткнулся на следующую формулировку в документации Apple.

iOS удалит ваши файлы из каталога Caches, когда это необходимо, поэтому ваше приложение должно будет деградировать, если файлы данных будут удален.

А также следующую статью, объясняющую далее об этой ситуации: http://iphoneincubator.com/blog/data-management/local-file-storage-in-ios-5

Моя проблема в том, что у меня нет фактического способа унижения изящно, так как я не могу автоматически позволить пользователю загружать так много модулей. Это может занять часы в зависимости от подключения к Интернету и размера модулей.

Итак, у меня есть несколько вопросов:

  • Кто-нибудь из вас когда-либо имел дело с подобной ситуацией, и если да, то как?
  • Кто-нибудь знает, когда именно iOS чистит кеш? Что считается предупреждением о "низком пространстве"? Таким образом, я мог бы хотя бы дать пользователю предупреждение о том, что у него недостаточно места для установки нового модуля.
  • Есть ли способ получить какое-то предупреждение перед очисткой папки Cache?

Это очень неприятный шаг от Apple, и я действительно не вижу выхода. Было бы очень приятно услышать от вас некоторые идеи.

Ответ 1

Изменить. После некоторого тестирования это кажется очень хорошим и не очищается.

Это еще не подтверждено на 100%, но он отлично работал на наших основных тестах (я принесу более подробные результаты по мере их поступления). Кажется, сохранение данных в приложении "Поддержка приложений" устраняет эти проблемы, так как эта папка не очищается.

Состояние docs:

Используйте постоянную директорию службы поддержки NSApplicationSupportDirectory, добавив ваш <bundle_ID> для: Файлы ресурсов и данных, которые ваше приложение создает и управляет для пользователя. Вы можете использовать этот каталог для хранения информации о состоянии приложения, вычисленных или загруженных данных или даже пользовательских данных, которые вы управляете от имени пользователя/файлов автосохранения. `

Вы можете попасть в эту папку следующим образом (обратите внимание на добавление идентификатора пакета в соответствии с требованиями официальных документов Apple):

[[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[[NSBundle mainBundle] bundleIdentifier]]

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

Изменить 2: Очень важно добавить эту строку, чтобы предотвратить синхронизацию временного содержимого от поддержки приложений. Я использую его в конце моего приложенияDidFinishLaunching:

[[NSURL URLWithString:NSApplicationSupportDir] setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:nil];