2.23: Приложения должны соответствовать Руководству по хранению данных iOS, иначе они будут отклонены

Загрузив приложение в магазин приложений, я получил эту ошибку.

2.23: Приложения должны соответствовать Руководству по хранению данных iOS, иначе они будут отклонены.

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

Чтобы быть более конкретным, это sqlite для загрузки карт в автономном режиме с библиотекой route-me.

Я использую sqlite для загрузки карты в автономном режиме, кажется, что эта карта хранится в качестве резервной копии в iCloud, поэтому я пропускаю ограничения на хранение.

Не знаю, как сказать, что эта копия не создана в iCloud.

Код выглядит следующим образом:

[[RMDBMapSource alloc] initWithPath: @ "map.sqlite"]; 

Размер файла 23MB

Любые идеи?


person jmartos89    schedule 02.03.2014    source источник
comment
Выполните поиск - начните со списка связанных вопросов, показанных справа. На эту тему существует множество дискуссий.   -  person rmaddy    schedule 03.03.2014


Ответы (2)


Скорее всего, вы храните свой «map.sqlite» в каталоге «Документы» вашего приложения. Файлы Sqlite обычно копируются в каталог Documents, чтобы они были доступны для записи. Но iOS по умолчанию пытается скопировать или сделать резервную копию всех файлов в каталоге «Документы» в iCloud (если резервное копирование iCloud включено). Поэтому, согласно рекомендациям Apple, вы можете сделать следующее, чтобы ваш файл базы данных не был скопирован в iCloud из каталога «Документы».

Вы можете вызвать следующую функцию, чтобы передать путь к вашему «map.sqlite» как NSURL:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath];
[self addSkipBackupAttributeToItemAtURL:url];

Функция предоставляется в Apple как:

- (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;
}

Эта функция гарантирует, что файл (предоставленный в виде URL-адреса) не будет зарезервирован iCloud.

Вы также можете поместить файлы базы данных в отдельный каталог внутри каталога Documents и пометить весь этот подкаталог как «не резервировать», вызвав эту функцию. Надеюсь, поможет.

person novice20    schedule 08.04.2014
comment
В какой файл мне нужно поместить эту команду? - person Jen143Me; 09.03.2016

В основном это зависит от типа данных, которые вы храните.

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

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

В первом сценарии у вас есть два основных способа добиться этого...

Либо вы используете NSURL для установки kCFURLIsExcludedFromBackupKey для своих файлов, либо вы сохраняете их в месте, для которого не будет резервного копирования, например <Application_Home>/Library/Caches. Обратите внимание, что второе решение лучше, ИМХО.

Для информации kCFURLIsExcludedFromBackupKey можно использовать следующим образом:

NSURL * fileURL;

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ];

[ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ];

Что касается второго сценария, иногда обозреватели Apple думают, что ваши данные могут быть сгенерированы повторно, когда это не так. Затем вам придется объяснить, почему данные должны быть скопированы.

person Ved Gupta    schedule 07.04.2015
comment
НИКОГДА не храните файл базы данных в каталоге Caches!! iOS очищает их при нехватке свободного места. - person Andrey Gordeev; 21.04.2016