Не делайте резервную копию в iCloud, но все равно отклонено

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
 [self addSkipBackupAttributeToItemAtURL:[self applicationDocumentsDirectory]];
}
    - (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (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
    return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];
  }
}

Но похоже, что это не работает - я все еще получаю отказ:

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

В частности, мы обнаружили, что при запуске и/или загрузке контента ваше приложение сохраняет 3,6 МБ. Чтобы проверить, сколько данных хранит ваше приложение:

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

И другая проблема в том, что я просто не могу это проверить - я не вижу свое приложение в

Настройки > iCloud > Хранилище и резервное копирование > Управление хранилищем

Может быть, проблема только с 5.0, о которой я здесь не думаю?


person Nikita Pestrov    schedule 05.06.2012    source источник
comment
Почему «закрытое» голосование? Этот вопрос определенно не по теме.   -  person Rok Jarc    schedule 05.06.2012
comment
Я думаю, что эта ссылка icapps.be/prevent-app-rejection -caused-by-icloud-storage будет полезен для вас, ребята.   -  person    schedule 01.08.2012


Ответы (1)


Проблема связана с iOS 5.0, в этой iOS вы не должны ставить флаг «Не делать резервную копию». Флаг «Не создавать резервную копию» был введен в iOS 5.0.1. обходной путь для работы с разными iOS Нам нужно было поддерживать iOS ‹ 5.0, iOS 5.0 и iOS > 5.0

Поэтому, связавшись с Apple, мы не нашли никакого решения, кроме как иметь разные пути на разных iOS.

У нас была такая функция:

+ (NSString*) savePath
{
    NSString *os5 = @"5.0";

    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

    if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedAscending) //lower than 4
    {
        return path;
    }
    else if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedDescending) //5.0.1 and above
    {        
        return path;
    }
    else // IOS 5
    {
        path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
        return path;
    }

    return nil;
}

Мы использовали и используем эту функцию.

Пожалуйста, прочитайте больше

iOS 5.0

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

http://developer.apple.com/library/ios/#qa/qa1719/_index.html

person Omar Abdelhafith    schedule 05.06.2012
comment
Спасибо за отличный ответ, но я думаю, что просто изменю цель развертывания на 5.0.1, это подойдет, верно? - person Nikita Pestrov; 05.06.2012
comment
Да, в моем случае я не мог этого сделать, так как мне нужно было поддерживать все версии iOS, вам нужно будет установить itunes, подключить минимальную версию ios до 5.0.1. - person Omar Abdelhafith; 05.06.2012
comment
Я не понимаю, как это соответствует правилам Apple iCloud. Это возвращает путь к папке документов как для версий ‹5.0.1, так и для версий ›5.0.1. Вы также устанавливаете NSURLIsExcludedFromBackupKey для версии › 5.0.1? - person Suz; 05.08.2012