Запрет бэкапа данных — выполняем пункт 2.23 App Store Review Guidelines

Недавно впервые в моей небольшой практике приложение во время проверки в App Store получило статус Rejected. После того, как шок был преодолен, я полез разбираться в проблеме и искать способ ее решения.

Причиной запрета публикации явился пункт 2.23 App Store Review Guidelines — “Apps must follow the iOS Data Storage Guidelines or they will be rejected.” Причина появления ошибки — добавление в программу нового словаря на 110.000 слов весом более 5мб. Вообще, все словари хранятся в разных таблицах одной sqlite базы данных. Ранее все это успешно хранилось вместе с остальными ресурсами приложения, но в связи с появлением функции добавления пользователем своих слов перекочевало в папку Documents.

По умолчанию раз в день данные всех приложений бэкапятся в iCloud. Исключение составляют папки cache, temp и, собственно, сам bundle. Разберемся, для чего вообще нужны эти папки:

  • <Application_Home>/Documents — хранение данных, созданных пользователем, или тех, которые не могут быть тем или иным образом восстановлены;
  • <Application_Home>/Library/Caches — хранение файлов, которые могут быть обновлены или скачаны снова. Как пример — тайлы карты, журналы, загруженные БД;
  • <Application_Home>/tmp — хранение данных, необходимых для текущей сессии. Папка должна быть очищена перед выходом из приложения.

Очевидных путей решения проблемы как минимум два:

  • Разделение БД на статические словари и пользовательский, с хранением первых в бандле, а второго — в папке Documents. Вариант не совсем удобен, так как в программе используются запросы, обращенные одновременно к статическим и динамическому словарям.
  • Отключение iCloud в свойствах проекта. Как оказалось, пресловутый бэкап выполняется даже с неактивированным iCloud.

Более подробный поиск в гугле натолкнул на третий вариант, который и оказался рабочим (для iOS 5.1 и выше):

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