1

我正在尝试标记我的应用程序 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];
    }
}
4

1 回答 1

5

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

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

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

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

  • 在 iOS 5.0.1 及更高版本中,将支持文件放在<Application_Home>/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支持。

事实证明,您可以在Technical Q&A 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];
}
于 2012-08-24T18:03:09.473 回答