8

我有文件 - 包括核心数据存储库在内的任意类型 - 我需要保留而不让 iOS 删除它们。通常,我不希望 iCloud 备份这些文件。我应该把它们保存在哪里?

4

1 回答 1

18

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

  • iOS 5.0

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

[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]
  • iOS 5.0.1

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

[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject]

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

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

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

PS:我还没有找到将Deployment目标设置为这个版本的方法,如果有方法请发表评论。

  • iOS 5.1

文件(或文件文件夹)应位于如上所述的“应用程序支持”文件夹中。要防止 iCloud 备份使用:

[URL setResourceValue: [NSNumber numberWithBool: YES] forKey:NSURLIsExcludedFromBackupKey error:&error]

如 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;
}
于 2012-09-11T13:52:32.123 回答