首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下载到文档并备份到iCloud的大型文件

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

Stack Overflow用户
提问于 2016-03-30 03:20:57
回答 2查看 310关注 0票数 7

我在应用商店里有一个iOS应用,可以下载相对较大的文件,这些文件需要留在设备上离线使用。这些文件目前存储在应用程序的Documents文件夹中,但我刚刚读到Documents文件夹已经备份,实际上应该只用于用户生成的内容。This Apple technical Q&A指出,应将NSURLIsExcludedFromBackupKey设置为阻止备份。This指出,应用程序的/Library/Caches是放置这些类型文件的正确位置,尽管进一步阅读表明,当设备存储空间较低时,文件夹可能会被清除,这对该应用程序来说是不可接受的。我相信/Library/Application Support/对他们来说是最好的位置--这听起来对吗?

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-04-06 23:09:31

正如技术问答中所述,最好的方法是在文档中创建一个子目录,并将该子目录排除一次。

票数 2
EN

Stack Overflow用户

发布于 2016-04-07 01:07:15

我不相信你可以写一个‘只做一次,并确保它已经完成’的例程,因为你不能保证你的应用程序在运行时不会崩溃。当你确定它已经完成时,你当然可以设置一个完成标志,这样一旦完成,你就不需要再次运行它了。

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

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

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

代码语言:javascript
复制
    - (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;
}

现在使用success的值在用户默认文件中设置密钥。在启动时检查该密钥。如果为false (或不存在),则(再次)运行此例程。

此示例使用文件路径。如果你愿意,你也可以对文件URL做同样的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36293296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档