Obj-C - 添加“跳过备份”属性总是失败

Posted

技术标签:

【中文标题】Obj-C - 添加“跳过备份”属性总是失败【英文标题】:Obj-C - Adding 'skip-backup' attribute always fails 【发布时间】:2012-07-19 15:50:23 【问题描述】:

我似乎无法从我的代码中获取备份属性参数。无论我似乎在做什么,该方法都会返回 false 并带有“未知错误 -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];
    

我对该方法的调用如下所示(在运行时它总是打印“不成功”):

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 文件夹?)。

提前感谢任何可以提供帮助的人! -文森特

【问题讨论】:

你的 iOS SDK 版本和 iOS 目标版本是什么? 对不起,我应该提到这一点。 iOS SDK 是:5.1,iOS 目标版本是:4.3(但如果需要,可以提高)。不过,我的设备在最新的操作系统上,这就是我从 Xcode 运行应用程序的地方。谢谢! 【参考方案1】:

为了解决这个问题,我最终只需要在 /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! :(");

当我这样做时,它实际上毫无问题地进入了“添加属性”日志语句!我不知道为什么这在单个文件级别不起作用,但至少这是有效的,而且它实际上是一个更好的解决方案,因为现在我不必遍历数百个文件来添加属性,我只必须将其添加到一个地方。

【讨论】:

以上是关于Obj-C - 添加“跳过备份”属性总是失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 Obj-C 插件和 AVAssetWriterInput 向视频添加音频

在swift或obj-c中的uitextview末尾添加一个视图

iOS/Obj-C UIScrollView 视图未正确添加

Swift 类未添加到 Obj-C 项目中 swift 的自动生成标题中

Android 数据库db 文件添加到手机总是失败求指教

向 python 类添加动态属性失败