Новая файловая политика iOS5

У каждого приложения iOS есть своя  рабочая директория, в которой находятся такие папки как Documents, Library/Caches и tmp  предназначенные для
хранения файлов. Причем содержимое папки Documents синхронизируются с бэкапом во время соединения с iTunes.
В любом учебнике или мануале по iOS 3.x-4.x было написано, что мы могли записывать любые данные в папку Documents — базу, кэш, картинки, скачанные из интернета —  в общем, всё что угодно.

До выхода iOS 5, система никогда не удаляла содержимое Caches и tmp, они были единственным безопасным местом для хранения данных, которые всегда должны быть доступны и в то же время которые можно повторно скачать в случае потери. Таким образом, эти данные не занимали место в резервных копиях и не замедляли синхронизацию.
Сейчас при попытке хранить данные в папке Documents ваше приложение получить Reject и письмо от Apple примерно такого содержания:
Мы обнаружили, что ваше приложение не следует iOS хранения данных Руководящих принципов, которые необходимы в Руководящих принципах App Store Review.

В частности, мы обнаружили, что на запуск и / или загрузку контента, ваше приложение хранит [XX ]MB. Чтобы проверить, сколько данных хранит ваше приложение:

  • Установите и запустите вашего приложения;
  • Перейдите в раздел Настройки-> iCloud-> Хранилище и копии ->хранилище;
  • Если необходимо, выберите «Показать все приложения»;
  • Проверьте хранение своего приложения.

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

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

Данные, которые могут быть воссозданы, но должны сохраняться для нормального функционирования вашего приложения — или потому, что клиенты ожидают, что это будет доступно для использования в автономном режиме — должны быть помечены  «do not back up» атрибутом. Для объектов NSURL добавьте NSURLIsExcludedFromBackupKey атрибут для предотвращения соответствующего файла резервному копированию. Для CFURLRef объектов используйте соответствующий атрибут kCFURLIsExcludedFromBackupKey.

Для получения дополнительной информации, пожалуйста, см. Технические Q & 1719: Как предотвратить файлы из резервной копии в iCloud и Itunes?.

Необходимо пересмотреть ваше приложение в соответствии с требованиями Руководства IOS хранения данных.
Для дискретных вопросов  на кодовом уровне вы можете проконсультироваться с поддержкой Apple Developer Technical. Пожалуйста, не забудьте:

- включить полные детали своих проблем “отклонения”;
— Подготовить любой symbolicated журнал аварии, скриншоты, и шаги для воспроизведения проблемы, для того чтобы  инженер DTS смог воспроизвести.

Для получения информации о том, как symbolicate и читать аварии журнала, см. Tech Note TN2151 понимания и анализа отчетов приложений iPhone OS Crash.

Если у вас есть трудности воспроизведения этому вопросу, пожалуйста, попробуйте протестировать рабочий процесс, как описано в рабочий процесс тестирования <https://developer.apple.com/library/ios/qa/qa1764/> с функцией Архив Xcode автора .

В документации всё объясняется предельно ясно:

  1.  Только документы и другие данные, созданные пользователем или которые не могут быть воссозданы вашим приложением, должны храниться в папке/Documents и будут автоматически синхронизированы с iCloud.
  2. Данные, которые могут быть повторно скачаны или воссозданы приложением, следует хранить в папке /Library/Caches. Например, такими являются файлы кэша базы данных или скачиваемый контент, как то, что используется приложениями для чтения журналов, газет и картографическими приложениями.
  3. Данные, которые используются лишь временно, должны храниться в /TMP каталоге. Хотя эти файлы не копируются в iCloud, не забудьте удалить эти файлы, чтобы они не продолжали занимать место на устройстве пользователя.
  4. Используйте  «do not back up» атрибут для указания файлов, которые должны оставаться на устройстве, даже в условиях недостаточного хранения. Используйте этот атрибут с данными, которые могут быть воссозданы, но должны сохраняться даже в условиях недостаточного хранения для нормального функционирования вашего приложения или потому, что клиенты ожидают, что это будет доступно в автономном режиме. Этот атрибут работает на отмеченных файлах независимо от того, в каком каталоге они находятся, в том числе каталоге Documents. Эти файлы не будут удалены и не будут включены в iCloud пользователя или ITunes резервного копирования. Ваше приложение ответственно за контроль и чистку периодически  этих файлов.

Отсюда следует, что тот контект, который может быть программно воссоздан либо скачан заново из интернета, помещать в Documents категорически запрещено (за это полагается Reject). Вместо этого, их следует помещать в Library/Caches, откуда система, в случае нехватки места на диске, их тут же удалит.
Естественно, разработчики стали возмущаться – пользователь не захочет пользоваться программой, из которой исчезает контент, накачанный дорогими мегабайтами сотового тарифа. Для этого, уже в 5.0.1, Apple добавила аттрибут Do Not Backup – стоит поставить такой на любой файл или папку в Documents, и iCloud вместе с iTunes будут их игнорировать. Вместе с тем, система не будет иметь права удалить их при нехватке свободного места, т.е. всё останется как по старинке. В коде это выглядит так (взято из официального источника):

Для iOS5.01 и младше можно использоваать код:


#import <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
const char* filePath = [[URL path] fileSystemRepresentation];
const char* attrName = "com.apple.MobileBackup";
u_int8_t attrValue = 1;
int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
return result == 0;
}

Для iOS5.0.1 и старше можно использовать код:


- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}

Примечание:
На  iOS5.0 невозможно исключить данные из резервного копирования. Если ваше приложение должно поддерживать iOS 5.0,то вам нужно будет хранить данные приложения в Caches, чтобы избежать резервного копирования этих данных. А оттуда, соответственно, iOS будет удалять эти файлы при необходимости, так что ваше приложение будет терять контент пользователя.

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий