【问题标题】:Where should I save data & files I want to keep long term, and how do I prevent iCloud from backing them up我应该在哪里保存我想长期保留的数据和文件,以及如何防止 iCloud 备份它们
【发布时间】:2012-09-04 11:29:05
【问题描述】:

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

【问题讨论】:

    标签: iphone objective-c ios core-data


    【解决方案1】:

    从 iOS5.0 及更早版本、5.0.1 和 5.1 及更高版本开始,本地保存文件发生了变化,主要是为了解决 iCloud 备份问题。有两个 Apple 源文档(File System Programming GuideQA1719)共同提供支持以下内容的信息:

    • 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;
    }
    

    【讨论】:

    • 如果我使用 '/Library/Application Support' 目录,为什么必须设置 NSURLIsExcludedFromBackupKey?那不是该目录的全部想法不备份其中的所有内容吗?我知道你是对的,但在我看来这没有意义。
    • 您不需要设置此值 - 如果您说要备份重要信息的数据库,则不要设置该标志。另一方面,如果数据不重要,则设置它。决定权在你。
    • 感谢您的详细回答。我试图在github.com/mx4492/MXPersistentCache 的一个易于使用的 pod 中编写这些方法
    • @Manav 旧方法现在可能没用了——现在每个人都至少针对 iOS 7 或 8。这是我大约 3 年前写的。
    • @DavidH 是的,我只为 iOS 5.1+ 场景添加了方法,即 AFAIK,即使在 iOS 7 和 8 中仍然是可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2016-10-06
    • 2020-02-16
    • 2012-03-08
    • 2013-02-04
    • 2013-08-22
    相关资源
    最近更新 更多