【问题标题】:How to know if a file would be backed in iCloud?如何知道文件是否会在 iCloud 中备份?
【发布时间】:2012-06-16 10:00:36
【问题描述】:

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

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

我还读到此代码对 iOS 版本 >= 5.0.1 很有用。并且 iOS 版本

所以,我有两个问题:

首先,我需要在我的应用程序中使用文件(如数据库)。如果我在 iOS 想要的任何时候将这些文件存储在 Caches 目录中,就可以删除我的文件。所以我将文件存储在 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 目录中,并且每次我需要使用该文件时检查“stills “ 那里。我有一个 500mb 的数据库,我不能每次都下载。

所以,第二个问题是:如果在“iOS 部署目标”中我选择了 5.1,而在 Build Settings > Base SDK 我也选择了 5.1,这意味着 iOS 版本 所以我不必担心与使用 iOS 5.0 的用户一起获取我的数据,对吧?

【问题讨论】:

    标签: ios icloud


    【解决方案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;
        }
    

    【讨论】:

      【解决方案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 的苹果文档,我假设只有文档数据被备份是错误的,但我仍然相信图书馆文件夹是非备份的最佳位置数据库。

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

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

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

      【讨论】:

      • 所以如果我将我的文件存储在库目录中,它将不会被备份,它也不会被 iOS 随时删除?我相信这里所说的:stackoverflow.com/questions/9743977/…“1 否决票接受事实证明,预编译的 Google Analytics 库在 /Library 目录中保留了一个名为 googleanalytics.sql 的小型数据库。一旦我发现这一点,我将标志设置为“不要备份”该文件并且它有效:我得到 0kb 备份。”正在备份库目录。
      猜你喜欢
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 2023-04-04
      • 2012-08-19
      • 2012-05-05
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多