У каждого приложения iOS есть рабочая папка для хранения файлов. Все элементы оттуда, кроме содержимого
Caches
и tmp
, синхронизируются с бэкапом во время соединения с iTunes.До выхода iOS 5, система никогда не удаляла содержимое
Caches
и tmp
, они были единственным безопасным местом для хранения данных, которые всегда должны быть доступны и в то же время которые можно повторно скачать в случае потери. Таким образом, эти данные не занимали место в бэкапах и не замедляли синхронизацию.В iOS 5, после появления бэкапов iCloud, компания Apple начала борьбу с приложениями, которые хранят слишком много данных в любой синхронизируемой папке, такой как
Documents
. Многие разработчики уже получили письма от Apple вроде такого:Во время последнего тестирования было обнаружено, что [ваше приложение] хранит значительное количество данных в папке Documents.
Поскольку бэкапы iCloud осуществляются ежедневно через Wi-Fi для каждого устройства iOS, важно гарантировать максимальное удобство для пользователя и минимизировать количество данных, хранимых вашим приложением.
Вдобавок к купленной музыке, приложениям, книгам, фотографиям и настройкам устройства, всё содержимое рабочей папки вашего приложения, включая папку Documents, синхронизируется с iCloud.
Сама программа, а также папки Caches и temp не синхронизируются с iCloud. Ваше приложение должно хранить данные в указанных местах, в соответствии с правилами пользования хранилища iCloud.
Пожалуйста, изучите указанную документацию, сделайте необходимые изменения и обновите версию программы в App Store.
В документации всё объясняется предельно ясно:
- Только документы и другие данные, созданные пользователем или которые не могут быть воссозданы вашим приложением, должны храниться в папке
<Application_Home>/Documents
и будут автоматически синхронизированы с iCloud.- Данные, которые могут быть повторно скачаны или воссозданы приложением, следует хранить в папке
<Application_Home>/Library/Caches
. Например, такими являются файлы кэша базы данных или скачиваемый контент, как то, что используется приложениями для чтения журналов, газет и картографическими приложениями.
Звучит просто: переместить всё, что можно повторно скачать, в
Caches
.Instapaper давно хранит скачанные статьи в папке
Caches
, потому что я не хотел замедлять пользователям синхронизацию с iTunes и увеличивать объём бэкапов без необходимости, а полное обновление базы случалось не так часто, чтобы стать проблемой для большинства людей. Новые правила вынуждают меня использовать Caches
: у меня больше нет выбора.Но в iOS 5 есть ещё одно важное изменение:
Caches
и tmp
— единственные два места, которые не входят в бэкап — подвергаются очистке, когда на устройстве кончается память.Многие разработчики сообщали об этой проблеме с Instapaper ещё до того, как iOS 5 стал доступен широкой публике, поэтому я с ужасом представляю, сколько будет жалоб, когда начнутся массовые продажи устройств с iOS 5.
Теперь не осталось места, где хранить файлы, которые не нужно бэкапить (или даже запрещено бэкапить, по новым правилам), но которые нельзя удалять в произвольное время. Это является проблемой для многих приложений, вот те из них, которые сразу приходят на ум:
- Instapaper и остальные программы, которые сохраняют веб-статьи для офлайнового чтения
- Приложения для чтения электронных книг (включая программу iBooks, если правила относятся и к ней)
- Подкаст-клиенты (за исключением тех подкастов, что синхронизируются с iTunes)
- Офлайновая Википедия
- Офлайновые картографические программы
Ключевое слово — офлайн. Вы можете сказать, что тут нет большой проблемы, ведь можно всё заново скачать в любое время из интернета. Но здесь не тот случай.
Типичный сценарий: пользователь Instapaper заполняет свой iPad контентом для длительного путешествия. Она синхронизирует пачку фильмов и подкастов, скачивает несколько журналов и покупает парочку новых игр, так что в итоге на устройстве почти не остаётся свободного места. Прямо перед посадкой на самолёт девушка вспоминает, что нужно скачать свежий выпуск журнала The Economist (я высокого мнения о своих пользователях). Из-за этого объём свободного места падает ниже критической отметки и срабатывает триггер, который запускает программу очистки в фоновом режиме. Незаметно для пользователя стирается всё, что она сохранила в Instapaper. Позже во время полёта, где нет доступа в интернет, она запускает Instapaper и находит программу девственно чистой.
(На прошлой неделе, почти в точности такой случай произошёл с одним из моих пользователей).
Из-за этого страдают все:
- Ей нечего читать (она только что прочла The Economist)
- Моя программа выглядит виновной, словно удалила все файлы, из-за чего у пользователя падает доверие к программе. Если мне повезёт, то девушка напишет в техподдержку и у меня будет шанс объяснить истинное положение дел. Но, скорее всего, она или тихо разочаруется, или поставит одну звёздочку в оценках на App Store, рассказывая всем, какая моя программа ненадёжная и удаляет все файлы без предупреждения. Из-за этого у меня снизятся продажи (одновременно снизится доход компании Apple, которая получает 30% от этих продаж).
- У девушки отрицательный опыт работы с iPad, планшет кажется менее надёжным, что плохо отразится на самой Apple и iOS.
Всё становится ещё хуже, если подумать, насколько часто доступ в интернет затруднён или невозможен:
- Устройства, которые находятся в офлайне большую часть дня, как iPod Touch и Wi-Fi iPad
- 3G-устройства в международном роуминге
- Любые устройства, которые работают в сети с высокими тарифами на передачу данных или маленьким месячным лимитом (типичный сценарий за пределами США)
- Устройства в удалённых районах, где даже самый лучший «широкополосный» доступ работает ужасно и невозможно быстро скачать пару сотен мегабайт
- Устройства, которые через несколько минут покинут зону Wi-Fi, и тут владелец осознаёт, что его контент удалён, но он опаздывает на работу, или у него дети попали под ливень на футбольном поле, или собака уже не может терпеть — в общем, нужно убегать прямо сейчас
Даже если у вас всегда есть быстрое и надёжное соединение с интернетом, внезапное удаление данных в приложении в любом случае представляет проблему.
Когда пользователь сохраняет статью в Instapaper, скачивает книгу в iBooks или подкаст в Instacast, он ожидает, что контент будет доступен при следующем запуске программы. Даже если технически возможно повторное скачивание, человек рассматривает этот контент как свои файлы — он лично положил их сюда и ему решать, когда и нужно ли их удалять.
Когда программа очистки всё стирает, выглядит, словно приложение удалило свои данные. И пользователь даже не знает, что это функция iOS 5 — он вполне логично винит разработчиков приложений. Хотя это не наша вина, это определённо станет нашей проблемой.
Очевидно, должно быть место для хранения файлов, каким был
Caches
до iOS 5: без резервного копирования на iTunes или iCloud, без синхронизации. Там файлы будут в неприкосновенности, пока саму программу не удалят с устройства.Автор текста — Марко Армент, автор программы Instapaper.