Obj-C - 添加'skip-backup'属性总是失败

时间:2012-07-19 15:50:24

标签: iphone objective-c ios icloud

我似乎无法从我的代码中获取备份属性参数。无论我做什么,该方法返回false并显示“Unknown Error -1”。我尝试了不同的跳过备份方法迭代,但下面是我正在使用的最新版本,基于我发现的另一篇文章:

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

我对该方法的调用如下所示(它在运行时始终打印“not successful”):

if ([self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:filePath]]) {
    NSLog(@"success!");
} else {
    NSLog(@"not successful");
}

filePath是文档文件夹图像的NSString路径。我记录了一个图像路径的示例,如下所示:

/var/mobile/Applications/B3583D06-38BC-45F0-A027-E79997F0EC60/Documents/myImage.png

在我的应用程序中,它循环遍历我推出的所有(众多)文件,并且它正在添加此属性。它在每一个都失败了。由于对这些动态驱动文件的离线功能的硬性要求,我需要能够实现这一点。我没有看到很多其他人都有这个问题,所以这告诉我,我可能会遗漏一些明显的东西,哈哈。

我发现了这篇文章:Why was my application still rejected after excluding files from iCloud backup using this code?

看起来我的问题看起来很有希望,但是没有关于如何具体解决的任何细节(它只是建议使用/ Library而不是docs文件夹?)。

感谢任何提前帮助的人! -Vincent

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我最终只需在/ Documents目录中创建一个文件夹,然后我更改了应用程序以将所有文件指向该子文件夹。

所以在我的AppDelegate中,在任何事先预先加载之前,我添加了如下代码:

NSString *tempDir = [documentsDirectory stringByAppendingString:@"/tempfiles"];
[[NSFileManager defaultManager] createDirectoryAtPath:tempDir
                      withIntermediateDirectories:NO
                                       attributes:nil
                                            error:nil];
NSURL *tempDirPathURL = [NSURL URLWithString:tempDir];
if ([[MainControl controlSystem] addSkipBackupAttributeToItemAtURL:tempDirPathURL]) {
        NSLog(@"did add attribute!");
} else {
    NSLog(@"adding attribute failed! :(");
}

当我这样做时,它实际上进入了'添加属性'日志语句,没有任何问题!我不知道为什么这不能在单个文件级别工作,但至少这个工作,它实际上是一个更好的解决方案,因为现在我没有循环数百个文件来添加属性,我只不得不把它添加到一个地方。