iOS 5 не позволяет хранить загруженные данные в каталоге Documents? - PullRequest
50 голосов
/ 21 ноября 2011

Я сделал приложение для своего клиента, сохранив целевую iOS как 4.
Но так как приложение все еще не отправлено в магазин Apple, мой клиент планирует обновить его до iOS 5.0.

Для этого я прочитал директиву от Apple и обнаружил, что «только пользовательские данные или которые не могут быть воссозданы вашим приложением, должны храниться в каталоге / Documents, а остальные должныхраниться в каталоге / Library / Caches "

В моем приложении я использую серверную модель покупки в приложении для непотребляемого продукта.Для этого я сохраняю все свои загруженные данные (в основном книги или журналы) в папку Documents.База данных также присутствует в том же каталоге, который содержит подробную информацию о загруженных продуктах.

Мой вопрос:
1. Должен ли я изменить свой код для сохранения загруженных данных в каталог Library / Caches вместо каталога Documents?
2. Где должен находиться файл моей базы данныхпомещены (в документы или кеши)?

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

Пожалуйста, помогите мне в этом вопросе.
Заранее спасибо.

ОБНОВЛЕНО:
Я обновляю это для тех, кто еще не уверен в этомпроблема.
Используя рекомендации принятого ответа, я реализовал это в 2 своих приложениях и отправил их в Apple Store.Оба были одобрены при рассмотрении.
Это может способствовать тому, что решение, предложенное в принятом ответе, является правильным.

Ответы [ 6 ]

58 голосов
/ 21 ноября 2011

Вот компромиссы:

  • Если вы поместите свои файлы в каталог «Документы», их резервные копии будут скопированы в iTunes или iCloud, но если они слишком большие и их можно будет снова загрузить, Apple может отклонить ваше приложение
  • Если вы поместите ваши файлы в каталог Cache, то они не будут сохранены в резервной копии, и Apple не отклонит ваше приложение. Однако, когда iOS 5 становится мало места, может удалить все файлы там.

Однако в iOS 5.0.1 есть третий вариант:

  • Поместите файлы в документы, но пометьте их, чтобы они не создавались резервные копии. Есть техника ( QA1719 ) о том, как это сделать.

Я думаю, что это, вероятно, лучший ответ для вас.

7 голосов
/ 21 ноября 2011

1.Должен ли я изменить свой код, чтобы сохранить загруженные данные в каталоге Library / Caches вместо каталога Documents? = Да, вам необходимо сохранить загруженные данные в каталоге Library / Caches.

2.Где должен храниться файл моей базы данных (для документов или кешей)? = Вы можете хранить базу данных в каталоге документов.

6 голосов
/ 21 ноября 2011

Одно приложение, которое я знаю, однажды было отклонено из-за этого.Хранение загружаемых данных в Documents dir не рекомендуется.Логика заключается в том, что ваши данные не должны излишне раздувать каталог приложения.Этот каталог приложений резервируется в iCloud, поэтому раздутый каталог приложений приведет к тому, что в iCloud будет сохранено больше данных.

Если данные можно будет снова загрузить, например, журналы, книги в формате PDF и т. Д. Затем сохраните их в каталоге Caches.Конечно, вы можете хранить указатели на данные (например, URL-адреса и т. Д.) В каталоге «Документы», чтобы пользователь мог получить их позже.

Чтобы ответить на ваши вопросы:

  1. Да, измените свойкод для загрузки БД из документов и данные из кэшей.
  2. Хранение базы данных в документах

Вам нужно будет добавить код, чтобы проверить, существует ли документ в БД в кэшах, если онваше приложение не должно загружать его снова.

4 голосов
/ 21 ноября 2011

В дополнение к предложению о том, что вы должны хранить данные в каталоге кеша, есть проблема, о которой вы должны помнить, когда храните данные в папке кеша:

Всякий раз, когда iOS чувствует перегрузку памяти, она удаляетвесь кеш и временная папка. Проблема подробно описана здесь Чтобы защитить эти каталоги, чтобы они не удалялись и все оставалось на всю жизнь, вы должны использовать атрибут, который будет поддерживать упомянутый каталог в безопасности.Решение здесь:

3 голосов
/ 01 октября 2012

Я искал тот же запрос, и у меня есть решение. Согласно документации по хранилищу данных Apple, dev может хранить данные в кеше, даже если пользователь хочет сохранить эти данные в ситуации нехватки памяти.

Use the "do not back up" attribute for specifying files that should remain on device, 
even in low storage situations. Use this attribute with data that can be recreated but
needs to persist even in low storage situations for proper functioning of your app or 
because customers expect it to be available during offline use. 

This attribute works on marked files regardless of what directory they are in, including      the Documents directory. 
These files will not be purged and will not be included in the user's iCloud 
or iTunes backup. Because these files do use on-device storage space, your app is 
responsible for monitoring and purging these files periodically.

Для получения дополнительной информации перейдите по этой ссылке

Используйте код «Ниже» для установки флага do not back up.

import <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1
    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;
} else { // iOS >= 5.1
    NSError *error = nil;
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return error == nil;
}

}

URL is the path of Data.

2 голосов
/ 23 ноября 2011

Я создал приложение для своего клиента, сохранив целевую iOS как 4. Но так как приложение все еще не отправлено в Apple Store, мой клиент планирует обновить его для iOS 5.0

Другой вариант (если вы собираетесь поддерживать только iOS 5) - использовать NewsstandKit.Таким образом, только выбранные выпуски журнала будут удаляться iOS при нехватке места на диске.Насколько я понимаю, iOS удалит выбранные проблемы на основе последнего прочитанного времени и, возможно, размера.

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

...