Используйте NSURLIsExcludedFromBackupKey без сбоев на iOS 5.0 - PullRequest
13 голосов
/ 08 марта 2012

Проверка доступности, кажется, работает нормально, но я не могу установить ключ NSURLIsExcludedFromBackupKey без этого сбоя при запуске:

dyld: символ не найден: _NSURLIsExcludedFromBackupKey Ссылка от: / Пользователи / sam / Библиотека / Поддержка приложений / iPhone Имитатор / 5.0 / Применения / B0872A19-3230-481C-B5CE-D4BDE264FBDF / Transit.app / Транзит Ожидается в: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/Foundation.framework/Foundation in / Users / sam / Библиотека / Поддержка приложений / iPhone Simulator / 5,0 / Применение / B0872A19-3230-481C-B5CE-D4BDE264FBDF / Transit.app / Transit

Вот мой метод:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {    
    if (&NSURLIsExcludedFromBackupKey == nil)
        return NO;

    NSError *error;
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return (error != nil);
}

Сбой исчезнет, ​​если я закомментирую эту строку:

[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];

Нужно ли слабое звено Foundation?

РЕДАКТИРОВАТЬ: не уверен, если это имеет значение, но этот метод помещен в категорию NSFileManager.

Ответы [ 6 ]

19 голосов
/ 08 марта 2012

Вот код для iOS <= 5.0.1 и> = 5.1 и включает технику миграции, упомянутую @Cocoanetics.

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];
    const char* attrName = "com.apple.MobileBackup";
    if (&NSURLIsExcludedFromBackupKey == nil) {
        // iOS 5.0.1 and lower
        u_int8_t attrValue = 1;
        int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
        return result == 0;
    } else {
        // First try and remove the extended attribute if it is present
        int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0);
        if (result != -1) {
            // The attribute exists, we need to remove it
            int removeResult = removexattr(filePath, attrName, 0);
            if (removeResult == 0) {
                NSLog(@"Removed extended attribute on file %@", URL);
            }
        }

        // Set the new key
        return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];
    }
}
5 голосов
/ 09 марта 2012

Похоже, это ошибка симулятора iPhone 5.0.Я попытался запустить код на устройстве 5.0 и без сбоев.Сообщил об этой ошибке как rdar: //11017158.

EDIT : это было исправлено в Xcode 4.5 DP2 (не уверен, что оно в 4.4).*

4 голосов
/ 15 июня 2012

Добавьте эту строку, чтобы символ был слабым импортом:

extern NSString * const NSURLIsExcludedFromBackupKey __attribute__((weak_import));
2 голосов
/ 04 июня 2013

В зависимости от того, что вы делаете, это быстрое решение может работать для вас. Это для меня.

Добавьте CoreFoundation Framework в свой проект и отметьте его как ДОПОЛНИТЕЛЬНО (не требуется).

1 голос
/ 08 марта 2012

Проблема в том, что этот ключ присутствует только в 5.1 и выше.Для 5.0.1 вам нужно установить расширенный атрибут файла.Единственным обратно совместимым методом было бы узнать значение NSString этого ключа и установить вместо этого значение ниже 5.1.

0 голосов
/ 22 июня 2012

У меня было то же самое после обновления ShareKit и повторного выполнения проекта для iOS 5.1. Я получаю либо ошибку при компиляции, либо при связывании, связанном с NSURLIsExcludedFromBackupKey. Представители ShareKit рекомендуют решить проблему, убедившись, что ваш проект связан с платформой CoreFoundation и для него задано значение «Необязательно», а не «Обязательно». Однако это не сработало для меня.

В конце концов я справился с этим, используя препроцессор:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    #ifndef NSURLIsExcludedFromBackupKey                   
    // 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
    // First try and remove the extended attribute if it is present
    int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0);
    if (result != -1) {
        // The attribute exists, we need to remove it
        int removeResult = removexattr(filePath, attrName, 0);
        if (removeResult == 0) {
            NSLog(@"Removed extended attribute on file %@", URL);
        }
    }
    return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];
    #endif
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...