设置NSDocumentDirectory,使其不备份到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.1 NSLog(@"%d",[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]); return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]; } } 

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

Apple肯定会忽略或删除主Documents文件夹中的该属性。 您应该做的是Apple告诉开发人员要做的事情(来自文件系统编程指南 ):

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

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

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

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

编辑:好吧,似乎信息已过期,文档尚未更新。 从iOS 5.1发行说明 :

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

在iOS 5.1及更高版本上运行的应用必须使用较新的属性,而不是直接添加com.apple.MobileBackup扩展属性,如前所述。 不推荐使用com.apple.MobileBackup扩展属性,并且可能会在将来的版本中删除对它的支持。

事实certificate,您可以在技术问答QA1719中获得实际代码。

此外,我发现我需要创建应用程序支持目录,至少在模拟器中。 希望这段代码有帮助:

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