我应该在哪里保存我想长期保存的数据和文件,以及如何阻止iCloud备份它们

Dav*_*d H 8 iphone core-data objective-c ios

我有任意类型的文件 - 包括核心数据存储库 - 我需要保留并且没有iOS删除它们.通常,我不希望iCloud支持这些文件.我应该在哪里保存它们?

Dav*_*d H 18

本地保存文件从iOS5.0及更早版本,5.0.1和5.1更新,主要更新为地址iCloud备份问题.有两个Apple源文档(文件系统编程指南QA1719),它们共同提供支持以下内容的信息:

  • iOS 5.0

文件应保存在"Caches"目录中,因为如果备份存储在Documents文件夹中,则无法阻止备份.请注意,系统可能会删除这些文件(请参阅QA1719),因此您需要能够根据需要重新创建每个文件.要查找缓存目录,请使用以下命令:

[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]
Run Code Online (Sandbox Code Playgroud)
  • iOS 5.0.1

文件应保存在'/ Library/Application Support'(FSP,第15页)中,可通过以下方式更好地访问:

[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject]
Run Code Online (Sandbox Code Playgroud)

我的经验是这个目录并不总是存在,因此您可能需要创建它:

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

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) {
        NSLog(@"ERROR app support: %@", error);
        exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

保存到此目录(或子目录)的文件需要一个扩展属性来告诉iCloud不要备份它们(参见QA1719).

PS:我还没有找到将部署目标设置为此版本的方法,如果有办法,请发表评论.

  • iOS 5.1

文件(或文件夹)应位于"应用程序支持"文件夹中,如上所述.为了防止iCloud备份使用:

[URL setResourceValue: [NSNumber numberWithBool: YES] ????forKey:NSURLIsExcludedFromBackupKey error:&error]
Run Code Online (Sandbox Code Playgroud)

如QA1719中所述.请注意,您可以将此密钥应用于目录以防止其内容被备份.QA1719的完整方法:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我使用'/ Library/Application Support'目录,为什么我必须设置NSURLIsExcludedFromBackupKey?是不是该目录的整个想法不备份其中的一切?我知道你是对的,但在我脑海里却没有意义. (2认同)