如何知道文件是否会在iCloud中备份?

时间:2012-06-13 12:38:10

标签: ios icloud

我的应用被拒绝了,因为我使用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的用户,对吗?

2 个答案:

答案 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;
    }