设置NSDocumentDirectory,使其不备份到iCloud

时间:2012-08-24 16:39:19

标签: iphone objective-c ios icloud

我正在尝试标记我的应用程序的NSDocumentDirectory的整个文件夹,以便将其从iCloud备份中排除,但是当我转到终端并运行:xattr -plxv com.apple.MobileBackup时出现此错误:否这样的xattr:com.apple.MobileBackup

提前感谢您提供的任何帮助。

以下是我正在使用的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSURL *pathURL= [NSURL fileURLWithPath:documentsDirectory];

    [self addSkipBackupAttributeToItemAtURL:pathURL];
}

- (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

        NSLog(@"%d",[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]);
        return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil];
    }
}

1 个答案:

答案 0 :(得分:5)

如何在iOS应用的文件夹上运行终端?你的意思是在模拟器中?

Apple肯定会忽略或删除主Documents文件夹中的该属性。您应该做的是Apple告诉开发人员要做的事情(来自File Systems Programming Guide):

  

处理支持文件 - 应用程序下载或生成的文件,并可根据需要重新创建 - 有两种方式之一:

     
      
  • 在iOS 5.0及更早版本中,将支持文件放在&lt; Application_Home&gt; /Library/Caches目录中以防止它们被备份

  •   
  • 在iOS 5.0.1及更高版本中,将支持文件放在&lt; Application_Home&gt; /Library/Application Support目录中,并将com.apple.MobileBackup扩展属性应用于它们。此属性可防止将文件备份到iTunes或iCloud。如果您有大量支持文件,则可以将它们存储在自定义子目录中,并将扩展属性应用于该目录。

  •   

因此,您在Application Support内为文件创建一个新目录,并将该属性应用于该目录。

编辑:好吧,似乎信息已过期且文档尚未更新。来自iOS 5.1 Release Notes

  

iOS 5.1引入了一个新的API来标记应该的文件或目录   没有备份。对于NSURL个对象,请添加   NSURLIsExcludedFromBackupKey属性阻止相应的   备份文件。对于CFURLRef objects,请使用相应的   kCFURLIsExcludedFromBackupKey属性。

     

在iOS 5.1和iOS上运行的应用程序   以后必须使用较新的属性而不添加   com.apple.MobileBackup直接扩展属性,如前所述   记录。 com.apple.MobileBackup扩展属性是   已弃用且对其的支持可能会在将来的版本中删除。

事实证明,您可以在Technical Q&A QA1719中获取实际代码。

另外,我发现我需要创建Application Support目录,至少在Simulator中。希望这段代码有所帮助:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // got to make sure this exists
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *appSupportDir = [self applicationAppSupportDirectory];
    if(![manager fileExistsAtPath:appSupportDir]) {
        __autoreleasing NSError *error;
        BOOL ret = [manager createDirectoryAtPath:appSupportDir withIntermediateDirectories:NO attributes:nil error:&error];
        if(!ret) {
            LTLog(@"ERROR app support: %@", error);
            exit(0);
        }
    }
    ...
}

- (NSString *)applicationAppSupportDirectory
{
    return [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
}