4

我的应用程序被拒绝,因为我使用 Documents 目录来存储我从服务器下载的一些文件。

我从 Apple 的文档中读到了这个:https ://developer.apple.com/library/ios/#qa/qa1719/_index.html我发现了这个代码:addSkipBackupAttributeToItemAtURL -> NSString 参数?

我还读到这段代码对 iOS 版本 >= 5.0.1 很有用。并且 iOS 版本 < 5 不使用 iCloud 备份用户数据。但是那个 iOS == 5.0 使用 iCloud 来备份数据,但是这个标志不起作用。

所以,我有两个问题:

首先,我需要我的应用程序中的文件才能工作(如数据库)。如果我在 iOS 想要的任何时候将这些文件存储在 Caches 目录中,就可以删除我的文件。所以我将文件存储在 Documents 目录中,即:

/Documents/db.db
/Documents/my.plist

之后,我将文件存储在该目录中,我为放入该目录中的每个文件调用方法 addSkipBackupAttributeToItemAtURL。但我不知道如何测试这种方法是否有效。

我在这里读过iOS 5.0.1:如何验证该文件夹是否被标记为 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 > Base SDK 我也选择了 5.1,这意味着 iOS 版本 < 5.1 的用户将无法下载我的应用程序,对吗?所以我不需要担心与使用 iOS 5.0 的用户一起获取我的数据,对吧?

4

2 回答 2

2

我相信答案很简单:不要使用文档目录。

如果您不使用文档目录并且不弄乱 iCloud 配置,则不会备份该数据。

我相信你可以使用这个问题的答案中描述的库文件夹:如何在 iPhone 上获得可写路径?

编辑:为了回答评论,我错误地认为只有文档数据被备份,根据http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTuning/PerformanceTuning上的苹果文档.html但我仍然认为 Library 文件夹是非备份数据库的最佳位置。

但是,您应该使用 setResourceValue:forKey:error: 方法设置一个非备份标志,如同一文档中所述。

文档中不清楚如何不在 iOS 版本 == 5.0 上备份数据,除非您愿意重新创建已删除的缓存数据(我相信您不会,因此您的问题)。

如果不是问题,请将您的应用程序锁定为仅在 iOS 5.1 或更高版本上运行(将您的应用程序设置为在 XCode 上的最低 iOS 版本上运行,记得清理您的整个构建并重新构建它)。

于 2012-06-13T12:49:38.047 回答
1

如果您的目标是 >= 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;
    }
于 2013-08-24T08:44:08.680 回答