Iphone 设置NSDocumentDirectory使其不备份到iCloud

Iphone 设置NSDocumentDirectory使其不备份到iCloud,iphone,objective-c,ios,icloud,Iphone,Objective C,Ios,Icloud,我正试图标记我的应用程序的NSDocumentDirectory的整个文件夹,以便将其从iCloud备份中排除,但当我转到终端并运行:xattr-plxv com.apple.MobileBackup时,我得到以下错误:没有这样的xattr:com.apple.MobileBackup 提前感谢您提供的任何帮助 以下是我正在使用的代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(

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

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

可以肯定的是,苹果将忽略或从主文档文件夹中删除该属性。你应该做的是苹果告诉开发者从以下方面做的事情:

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

在iOS 5.0及更早版本中,将支持文件放入:

iOS 5.1引入了一个新的API来标记应该 不需要备份。对于NSURL对象,添加 NSURLISECLUDED FROMBACKUPKEY属性以阻止相应的 文件不被备份。对于CFURLRef对象,使用相应的 kCFURLIsExcludedFromBackupKey属性

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

事实证明,您可以在中获得实际代码来执行此操作

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

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

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

可以肯定的是,苹果将忽略或从主文档文件夹中删除该属性。你应该做的是苹果告诉开发者从以下方面做的事情:

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

在iOS 5.0及更早版本中,将支持文件放入:

iOS 5.1引入了一个新的API来标记应该 不需要备份。对于NSURL对象,添加 NSURLISECLUDED FROMBACKUPKEY属性以阻止相应的 文件不被备份。对于CFURLRef对象,使用相应的 kCFURLIsExcludedFromBackupKey属性

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

事实证明,您可以在中获得实际代码来执行此操作

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

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

但是/Library/Application-Support目录可以被系统删除吗?我的应用程序中现在有代码,如果没有,可以创建它。也就是说,我严重怀疑苹果在告诉我们使用该文件夹时是否会删除该文件夹。文档从来没有真正说它应该已经存在或者你应该创建它-人们会认为它已经被创建了,但是在我在模拟器中使用时,文件夹不在那里。是的,除非你创建它,否则文件夹不在那里,但我指的是系统在内存不足的情况下删除那里的文件,比如缓存文件夹。我希望在我的应用程序中下载永久图像以供脱机使用,我不确定是否应将它们存储在NSDocumentDirectory或NSApplicationSupportDirectory中。我使用的是不要备份iCloud,只要重新阅读苹果公司在其文件系统备忘录和技术说明中对此的声明即可。他们一遍又一遍地告诉你,如果你有需要保留的文件——不应该被删除的文件——将它们放在那个文件夹中,而不是缓存文件夹中。别相信我的话,直接读他们的文件。苹果公司不可能告诉你将重要信息保存在某个目录中,然后稍后再删除这些信息。OK。来自ios数据存储指南:4。使用“不备份”属性指定即使在存储容量较低的情况下也应保留在设备上的文件。将此属性用于可以重新创建但即使在存储空间较低的情况下也需要保留的数据,以确保应用程序正常运行,或者因为客户希望它在脱机使用时可用。此属性适用于标记的文件,无论它们位于哪个目录中,包括Documents目录。这些文件不会被清除,也不会包含在用户的iCloud或iTunes备份中。但是系统可以删除/Library/Application Support目录?我的应用程序中现在有代码,如果不存在,可以创建它。也就是说,我严重怀疑苹果在告诉我们使用该文件夹时是否会删除该文件夹。文档从来没有真正说它应该已经存在,还是你应该创建它——人们会认为它会存在
d已经被创建,但在我使用的模拟器中,文件夹不在那里。是的,除非你创建它,否则文件夹不在那里,但我指的是系统在内存不足的情况下删除那里的文件,比如缓存文件夹。我希望在我的应用程序中下载永久图像以供脱机使用,我不确定是否应将它们存储在NSDocumentDirectory或NSApplicationSupportDirectory中。我使用的是不要备份iCloud,只要重新阅读苹果公司在其文件系统备忘录和技术说明中对此的声明即可。他们一遍又一遍地告诉你,如果你有需要保留的文件——不应该被删除的文件——将它们放在那个文件夹中,而不是缓存文件夹中。别相信我的话,直接读他们的文件。苹果公司不可能告诉你将重要信息保存在某个目录中,然后稍后再删除这些信息。OK。来自ios数据存储指南:4。使用“不备份”属性指定即使在存储容量较低的情况下也应保留在设备上的文件。将此属性用于可以重新创建但即使在存储空间较低的情况下也需要保留的数据,以确保应用程序正常运行,或者因为客户希望它在脱机使用时可用。此属性适用于标记的文件,无论它们位于哪个目录中,包括Documents目录。这些文件不会被清除,也不会包含在用户的iCloud或iTunes备份中。