Ios 下载到文档并备份到iCloud的大型文件

Ios 下载到文档并备份到iCloud的大型文件,ios,Ios,我在app store中有一个iOS应用程序,可以下载需要留在设备上离线使用的相对较大的文件。这些文件目前存储在应用程序的Documents文件夹中,但我刚刚读到Documents文件夹已经备份,应该只用于用户生成的内容。说明应设置nsurlisecludedfrombackupkey以防止备份。声明应用程序的/Library/Caches是放置此类文件的正确位置,尽管进一步阅读表明,当设备存储空间不足时,文件夹可能会被清除,这是此应用程序无法接受的。我相信/Library/Applicatio

我在app store中有一个iOS应用程序,可以下载需要留在设备上离线使用的相对较大的文件。这些文件目前存储在应用程序的
Documents
文件夹中,但我刚刚读到
Documents
文件夹已经备份,应该只用于用户生成的内容。说明应设置
nsurlisecludedfrombackupkey
以防止备份。声明应用程序的
/Library/Caches
是放置此类文件的正确位置,尽管进一步阅读表明,当设备存储空间不足时,文件夹可能会被清除,这是此应用程序无法接受的。我相信
/Library/Application Support/
是他们的最佳位置——这听起来对吗

不幸的是,这个错误通过了应用程序审查过程。现在人们正在使用应用程序,并且已经有一些文件保存到
文档
文件夹及其备份中,有哪些最佳做法可以解决这个问题?似乎我需要移动所有现有文件,并在应用程序更新时设置它们的
nsurlisecludedfrombackupkey
。我如何保证此操作只执行一次,并且不会中断?将文件移出
文档
文件夹是否重要,或者我是否可以将其留在那里?更改文件的备份状态会将其从现有备份中删除吗


我使用的是Swift 2.1.1,目标是iOS 8.0+。

如技术问答中所述,您最好在文档中创建一个子目录,并排除该子目录一次。

我不相信您可以编写“一次完成并确保完成”例程,因为您无法保证您的应用程序在运行时不会崩溃。您当然可以在确定已完成时设置完成标志,以便完成后不必再次运行

从备份中排除目录,而不是单个文件。 从Xcode:

您可以使用此属性排除备份中不需要的缓存和其他应用程序支持文件。通常对用户文档执行的某些操作会导致此属性重置为false;因此,不要在用户文档上使用此属性

以下是我使用的策略,效果良好 (对不起,这是objective-c——我不是一个敏捷的人。希望它能给你这个想法):

-(BOOL)移动所有文件{
//在文档目录中搜索以.data结尾的所有文件
布尔成功=真;
NSString*myNewLocation=@“/store/my/files/here/now”;
//获取文档目录
NSArray*documentDirectories=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSString*documentDirectory=[documentDirectories objectAtIndex:0];
//获取以.data结尾的所有文件(无论文件类型如何)
NSArray*DataFileArray=[NSArray arrayWithArray:[NSBundle路径ForResourceSoftType:@“数据”目录:documentDirectory]];
//如果有多个资源类型,请对每个资源类型使用此行,然后追加数组。
//迭代找到的文件
NSString*文件名=[NSString];

对于(int i=0;iThanks,@Peter)。我现在所做的是将文档目录中保存有问题下载的文件夹标记为不可备份。我找不到关于是否需要移动文件或是否可以保留文件的确切答案。您引用的文章中说“不要在用户文档上使用此属性”但是技术问答说可以。你找到关于这方面的任何进一步文档了吗?我认为这会起作用。我确实发现官方示例在是否在文件上使用“不备份”标志方面存在矛盾,但鉴于上面的文章包含了不这样做的原因(该标志可能会因用户交互而改变),我认为这将是坚持使用目录的最谨慎的方法。谢谢,@Allen。这些文件已经在一个文件夹中,所以我确实排除了它们,并通过了app review。声明通常对用户文档执行的某些操作会导致此属性重置为false;因此,不要对用户文档使用此属性"这让我很担心。目前,我只是在每次应用程序启动时排除目录,但它似乎并不理想。不用担心,这适用于Documents文件夹,而不是您将要使用的子目录,请记住,在iOS中,没有其他人可以访问您的应用程序环境。如果您可以添加一个源,确认可以在文档中保留文件ts文件夹,并向您的答案中添加更多详细信息,例如更改文件状态是否会将其从现有备份中删除(可能不会?),我可以接受答案。看,同步一词表示将从现有备份中删除文件。
    - (BOOL)moveAllFiles{

    // Searches through the documents directory for all files ending in .data
    BOOL success = true;
    NSString *myNewLocation = @"/store/my/files/here/now";

    // Get the documents directory
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [documentDirectories objectAtIndex:0];

    // Get all files ending in .data (whatever your file type is)
    NSArray *dataFilesArray = [NSArray arrayWithArray:[NSBundle pathsForResourcesOfType:@"data" inDirectory:documentDirectory]];
    // If you have multiple resource types, use this line once each for each resource type, then append the arrays.

    // Iterate the found files
    NSString *fileName = [NSString string];
    for (int i=0; i<[dataFilesArray count]; i++) {
        fileName = [[dataFilesArray objectAtIndex:i] lastPathComponent];

        // Move file, set success to false if unsuccessful move
        if (![[NSFileManager defaultManager] moveItemAtPath:[dataFilesArray objectAtIndex:i]
                                                    toPath:[myNewLocation stringByAppendingPathComponent:fileName]
                                                     error:nil]) {
            success = false; // Something went wrong
        }
    }
    return success;
}