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

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

2.23: Приложения должны следовать рекомендациям по хранению данных iOS или отклоняться

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

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

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

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

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

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

Размер файла составляет 23 МБ

любые идеи?

Ответ 1

Скорее всего, вы сохраняете свой "map.sqlite" в папке "Документы приложений". Файлы Sqlite обычно копируются в каталог Documents так, чтобы они были доступны для записи. Но iOS по умолчанию пытается скопировать или сохранить все файлы в каталоге Documents в 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 и пометить весь подкаталог как "не делать резервные копии", вызвав эту функцию. Надеюсь, что это поможет.

Ответ 2

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

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

В противном случае резервная копия 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 считают, что ваши данные могут быть сгенерированы повторно, когда это не так. Затем вам нужно будет объяснить, почему данные должны быть скопированы.