iOS 5不允许将下载的数据存储在Documents目录中?
我通过将目标iOS保持为4来为我的客户做了一个应用程序。
但由于应用程序仍然没有提交给苹果商店,我的客户计划升级它的iOS 5.0。
为此,我从Apple阅读指南并发现:“只有用户生成的数据或者不能被应用程序重新创build的数据应该存储在/ Documents目录中,其余部分应该存储到/ Library / Caches目录中”
在我的应用程序中,我正在使用非易失性产品的应用内购买服务器模型。 为此,我将所有下载的数据(基本上是书籍或杂志)存储到Documents目录中。 数据库也存在于包含下载产品细节的相同目录中。
我的问题是,
1.我是否必须更改我的代码以将下载的数据存储到Library / Caches目录而不是Documents目录?
2.我的数据库文件应放在哪里(文档或caching)?
如果我把它的产品放在caching中,那么我也必须改变检索的逻辑,因为考虑到如果logging存在于数据库中,就不需要改变文件的存在,当用户点击时它就直接打开该杂志。
请在这个问题上指导我。
提前致谢。
更新:
我正在更新这个对于那些仍然不确定这个问题的人。
使用接受答案的指导原则,我已经在我的两个应用程序中实现了这一点,并将其提交给Apple Store。 两者都在审查中获得批准。
这可能会促使在接受的答案中提出的解决scheme是正确的。
这里是权衡:
- 如果你把你的文件放在Documents目录下,那么它们会被备份到iTunes或者iCloud,但是如果它们太大而又可以再次下载文件,那么苹果可能会拒绝你的应用程序
- 如果你把你的文件放在caching目录中,那么它们将不会被备份,苹果也不会拒绝你的应用程序。 但是,当iOS 5空间不足时, 可能会删除其中的所有文件。
不过,在iOS 5.0.1中还有第三种select:
- 将文件放入文档中,但将其标记为不备份。 有一个技术说明( QA1719 )如何做到这一点。
我想这可能是你最好的答案。
1.我是否必须更改我的代码以将下载的数据存储到Library / Caches目录而不是Documents目录? =是,您需要将下载的数据存储到Library / Caches目录。
2.我的数据库文件应放在哪里(文档或caching)? 你可以把数据库保存在Documents目录下。
我知道的一个应用程序曾因此被拒绝。 不build议在Documents dir中存储可下载的数据。 其背后的逻辑是你的数据不应该不必要地夸大应用程序目录。 这个应用程序目录是在iCloud中备份的,所以虚拟目录会导致更多的数据被保存在iCloud中。
如果数据可以再次下载,如杂志,书籍pdf等,然后将其保存在Caches目录中。 当然,您可以将指向数据的指针(如URL等)存储在Documents目录中,以便用户稍后可以检索它们。
回答你的问题:
- 是的,更改您的代码以从caching中的文档和数据加载数据库。
- 保持数据库在文档中
您将不得不添加代码来检查数据库中的文档是否存在于caching中,如果它不是您的应用程序应该再次下载。
除了build议您应该将数据保存在caching目录中之外,在将数据保存到caching文件夹时,请注意以下几点:
每当iOS感觉到内存紧缩,它将删除所有的caching和临时文件夹。 问题在这里详细描述为了保护这些目录不要删除并保留所有的一生,你应该使用将保持提到的目录安全的属性。 解决scheme在这里:
我正在寻找相同的查询,我已经得到了解决scheme。 根据苹果的数据存储文档dev甚至可以将数据存储在caching中,即使用户要将该数据保存在低内存的情况下。只需要设置Do not back up
标志。
Use the "do not back up" attribute for specifying files that should remain on device, even in low storage situations. Use this attribute with data that can be recreated but needs to persist even in low storage situations for proper functioning of your app or because customers expect it to be available during offline use. This attribute works on marked files regardless of what directory they are in, including the Documents directory. These files will not be purged and will not be included in the user's iCloud or iTunes backup. Because these files do use on-device storage space, your app is responsible for monitoring and purging these files periodically.
欲了解更多信息,请通过此链接
使用下面一段代码设置do not back up
标志。
import <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1 const char* filePath = [[URL path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); return result == 0; } else { // iOS >= 5.1 NSError *error = nil; [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; return error == nil; }
}
URL is the path of Data.
我已经为我的客户做了一个应用程序,目标iOS保持为4.但由于应用程序仍然没有提交给苹果商店,我的客户计划升级它的iOS 5.0
另一个select(如果你只是要支持iOS 5)是使用NewsstandKit。 这样一来,只有在“磁盘”空间不足的情况下,杂志的选定问题才会被iOS删除。 我的理解是,iOS将根据上次阅读的内容以及大小来删除所选的问题。
如果您不使用报摊,并且您的应用程序有针对性,则所有问题都将被删除。