Моё приложение для iphone было отклонено по этой причине: «Мы обнаружили, что ваше приложение не соответствует рекомендациям iOS для хранения данных, ...» - PullRequest
20 голосов
/ 07 января 2012

Мое приложение для iphone было недавно отклонено по следующей причине:

"Мы обнаружили, что ваше приложение не соответствует Рекомендациям по хранению данных iOS, что не соответствует Рекомендациям по обзору App Store".

Для этого приложения я хранил базу данных (файл sqlite) в каталоге / Documents / для iOS 5.0.1 и более поздних версий и для iOS 5.0 и более поздних версий. Я использовал каталог Library / Cache.

Для других данных, таких как PDF и графические изображения, которые я загружал с сервера, я использовал тот же подход, что и выше, например: iOS 5.0.1 и более поздние версии: Сохранение этих данных в / Documents / directory iOS 5.0 и более ранние версии: Сохраненные данные в каталоге Library / Cache.

Правильный ли этот подход?

Согласно руководству Apple: Важно : Новый атрибут «не выполнять резервное копирование» будет использоваться только в iOS 5.0.1 или более поздней версии.На iOS 5.0 и более ранних версиях приложения должны будут хранить свои данные в / Library / Caches, чтобы избежать их резервного копирования.Так как этот атрибут игнорируется в старых системах, вам необходимо убедиться, что ваше приложение соответствует Руководству по хранению данных iOS во всех версиях iOS, которые поддерживает ваше приложение.

Также очень озадачен тем, что «не выполнять резервное копирование»назначение атрибутов для данных, хранящихся в iOS 5.0.1 и более поздних версиях.Для каких файлов мне нужно назначить этот флаг?Могу ли я использовать его для базы данных?.

Нужно избавиться от этих отклонений, как это произошло дважды.Пожалуйста, предоставьте некоторые рекомендации по хранению данных для моего приложения.Заранее спасибо.Ждем положительного ответа.

Ответы [ 3 ]

17 голосов
/ 07 января 2012

Отметьте https://developer.apple.com/icloud/documentation/data-storage/

, в частности:

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

Сохраните базу данных SQLite в папке caches и установите флаг donotbackup, который остановит удаление файласистема очистки кэша

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    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;
}

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

Кроме того, выможет хранить ваши данные в подпапке каталога документов, которая, как мне кажется, не будет сохранена, но сохранится.

6 голосов
/ 07 января 2012

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

После внедрения iCloud в Apple данные каталога документов каким-то образом связаны с iCloud Storage. Следовательно, Apple теперь отклоняет приложения, использующие хранилище тяжелых данных в каталоге документов.

Вам нужно хранить данные в другом месте. Сохраните файл PDF и другие изображения в другом месте.

Эта ссылка может вам помочь.

http://www.techotopia.com/index.php/Working_with_Directories_on_iOS_4_%28iPhone%29

Надеюсь, это решит вашу проблему.

2 голосов
/ 25 февраля 2014

Решение проблемы Приложение, отклоненное Apple для вашего приложения, не соответствует рекомендациям iOS по хранению данных, добавьте следующий код в ваше приложение.

   - (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;  
            // if you set YES in Resources value then iTune will not backup that file or folder.
            //  You set FALSE in Resources value then iTune will backup that file or folder.
             [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];  
             return error == nil;
        } 
}

Чтобы использовать этот метод (пример)

NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"CDTDatabaseNew" ofType:@"sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
NSURL *guidesURL = [NSURL fileURLWithPath:dbPath];
[self addSkipBackupAttributeToItemAtURL:guidesURL];

Этот метод необходимо использовать при создании или копировании файлов в каталоге документов.

ПРИМЕЧАНИЕ: -Apple изменил руководство по хранению данных, и если вы храните что-либо в каталоге документов, то вы должны исправить вышеприведенный код, не пропустите эту часть кода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...