大文件下载到文档并备份到iCloud
我在应用商店中有一个iOS应用,可以下载需要保留在设备上供离线使用的相对较大的文件。 这些文件当前存储在应用程序的“ Documents
文件夹中,但我现在正在阅读“ Documents
文件夹进行备份,并且应该仅用于用户生成的内容。 此Apple技术问答指出, NSURLIsExcludedFromBackupKey
应设置为防止备份。 这表明,应用程序的/Library/Caches
是放这些文件的正确位置,虽然进一步阅读表明该文件夹可能会被清除,当设备存储空间不足,这是不适合这个应用程序。 我相信/Library/Application Support/
是他们的最佳位置 - 这听起来是对的吗?
不幸的是,这个错误通过应用程序审查过程。 现在有人正在使用应用程序,并且已经有一些文件保存到“ Documents
文件夹及其备份中,但有哪些最佳做法可以解决此问题? 看来我需要移动所有现有的文件,并在应用更新时设置NSURLIsExcludedFromBackupKey
。 我如何保证完成一次并且不会中断? 将文件移出Documents
文件夹很重要,还是可以将它们留在那里? 将更改文件的备份状态从现有的备份中删除它们吗?
我正在使用Swift 2.1.1并且定位iOS 8.0+。
正如技术问答中所述,最好的办法可能是在文档中创建一个子目录,并排除该子目录一次。
我不相信你可以写一个'做一次并确保完成'的例行公事,因为你不能保证你的应用在运行时不会崩溃。 你确定可以设置一个完成标志,当你确定它完成后,一旦完成,你不必再次运行它。
从备份中排除您的目录,而不是单个文件。 来自Xcode:
您可以使用此属性来排除备份中不需要的缓存和其他应用程序支持文件。 通常对用户文档进行的一些操作会导致此属性重置为false; 因此,不要在用户文档上使用此属性。
这是我用过的战略,取得了很好的结果(对不起,它在Objective-C中 - 我不是一个快速的家伙,希望它会给你这个想法):
- (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;
}
现在使用成功的值在用户默认文件中设置一个键。 在启动时检查该密钥。 如果它是假的(或不存在),请运行此例程(再次)。
这个例子是文件路径。 如果您愿意,您可以使用文件网址做同样的事情。
链接地址: http://www.djcxy.com/p/90983.html上一篇: Large files downloaded to Documents and backed up to iCloud