Технические вопросы и ответы QA1719

Как я препятствую тому, чтобы файлы были поддержаны до iCloud и iTunes?

Q: Мое приложение имеет много файлов, которые должны храниться на устройстве постоянно для моего приложения для функционирования должным образом оффлайн. Однако те файлы не содержат пользовательские данные и не должны быть скопированы. Как я могу препятствовать тому, чтобы они были скопированы?

A: На iOS приложения ответственны за обеспечение, что только пользовательские данные и не данные приложения поддерживаются до iCloud и iTunes. Точные необходимые шаги варьируются между версией iOS, таким образом, этот QA опишет процесс для каждой версии iOS. Для получения дополнительной информации о точно, какие данные должны или не должны быть скопированы, посмотрите раздел App Backup Best Practices Руководства по программированию приложения для iOS.

iOS 5.1 и позже

Запускаясь в iOS 5.1, приложения могут использовать или NSURLIsExcludedFromBackupKey или kCFURLIsExcludedFromBackupKey свойства файловой системы для исключения файлов и каталогов от резервных копий. Приложения, которые должны исключить большое количество файлов, могут исключить их путем создания их собственного подкаталога и маркировки того каталога, как исключено. Приложения должны создать свои собственные каталоги для исключения, вместо исключения системы определил каталоги. Любой из этого APIs предпочтен по более старому, осуждаемому подходу прямой установки расширенного атрибута. Все приложения, работающие на iOS 5.1 и позже, должны использовать этот APIs для исключения данных из резервных копий.

Перечисление 1  , Исключая Файл от Резервных копий на iOS 5.1 и позже

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
    NSURL* URL= [NSURL fileURLWithPath: filePathString];
    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;
}

iOS 5.0.1

Если Ваше приложение должно поддерживать iOS 5.0.1, можно использовать следующий метод для установки, «не копируют» расширенный атрибут. Каждый раз, когда Вы создаете файл или папку, которая не должна быть скопирована, записать данные в файл и затем вызвать этот метод, передающий в URL файлу.

Перечисление 2  , Устанавливающее Расширенный Атрибут на iOS 5.0.1

#import <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: filePathString]);
 
    const char* filePath = [filePathString 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;
}

iOS 5.0

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



История версии документа


ДатаПримечания
11.03.2015

Измененные фрагменты кода для использования аргумента строки вместо URLs. Обновленная ссылка к разделу App Backup Best Practices в Руководстве по программированию Приложения.

23.04.2012

Обновленный для iOS 5.1

10.11.2011

- Исправленная критическая ошибка во фрагменте кода.

 

Новый документ, описывающий, как приложение может препятствовать тому, чтобы файлы были поддержаны до iCloud и iTunes.