我的应用被拒绝了,因为我使用Documents目录来存储我从服务器下载的一些文件。
我已经从Apple的文档https://developer.apple.com/library/ios/#qa/qa1719/_index.html中获取此信息,我发现此代码:addSkipBackupAttributeToItemAtURL -> NSString parameter?
我还读到这段代码对于iOS版本> = 5.0.1非常有用。那个iOS版本< 5不要使用iCloud备份用户数据。但iOS == 5.0使用iCloud备份数据,但标志不起作用。
所以,我有两个问题:
首先,我需要在我的应用程序中使用文件(如数据库)。如果我想将这些文件存储在Caches目录中,那么iOS可以删除我的文件。所以我将我的文件存储在Documents目录中,即:
/Documents/db.db
/Documents/my.plist
之后我将文件存储在该目录中,我为每个放在该目录中的文件调用addSkipBackupAttributeToItemAtURL方法。但我不知道如何测试这种方法是否有效。
我在这里iOS 5.0.1 : How to verify that the folder is marked as "Do not back up" for iCloud?,如果我使用模拟器,我可以转到应用程序的目录并运行此命令
xattr -plxv com.apple.MobileBackup <file name>
知道文件是否已标记为未备份。
但是如果我在命令行中运行该命令,我会得到每个文件的结果:
xattr:my.plist:没有这样的xattr:com.apple.MobileBackup
所以,第一个问题是:如何确保我的Documents目录下的文件被正确标记为不备份。我不想再将我的应用程序上传到AppStore,并且Apple的人员再次将其丢弃。
其次,我的应用程序在iOS 5下运行。如果用户有iOS 5.0并且将其存储在Caches目录中,我不想检查每个文件,每次我需要使用该文件时检查“静止” “ 那里。我有一个500mb的数据库,每次都无法下载。
所以,第二个问题是:如果在“iOS部署目标”中,我选择5.1并在Build Settings&gt;中基础SDK我也选择5.1它意味着iOS版本的用户&lt; 5.1不能下载我的应用程序,对吗?所以我不需要害怕将我的数据带到iOS 5.0的用户,对吗?
答案 0 :(得分:2)
我相信答案很简单:不要使用文件目录。
如果您不使用文档目录并且不弄乱iCloud配置,则不会备份该数据。
我相信您可以按照此问题的答案中所述使用库文件夹:How can I get a writable path on the iPhone?
编辑:为了回答评论,根据http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTuning/PerformanceTuning.html的苹果文档,我错误地认为只备份了文档数据,但我仍然相信库文件夹是非支持的最佳位置-up数据库。
但是,您应该使用setResourceValue:forKey:error:方法设置一个非备份标志,如同一文档中所述。
目前尚不清楚文档如何不在iOS版本== 5.0上备份数据,除非您愿意重新创建已删除的缓存数据(我相信您不会,因此您的问题)。
如果不是问题,请锁定您的应用仅适用于iOS 5.1或更高版本(将您的应用设置为在XCode上的最低iOS版本上运行,请记得清理整个版本并重新构建它。)
答案 1 :(得分:1)
如果您的目标是&gt; = iOS 5.1以下代码将帮助您。使用以下方法排除在iCloud上备份项目。您甚至可以使用此代码排除整个文件夹
- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *)filePathString {
NSURL *fileURL =
[NSURL fileURLWithPath:filePathString];
assert([[NSFileManager defaultManager]
fileExistsAtPath: [fileURL path]]);
NSError *error = nil;
BOOL success = [fileURL setResourceValue:[NSNumber numberWithBool:YES]
forKey:NSURLIsExcludedFromBackupKey
error:&error];
return success;
}