iOS 5.0.1:如何验证文件夹是不是标记为 iCloud 的“不备份”?

Posted

技术标签:

【中文标题】iOS 5.0.1:如何验证文件夹是不是标记为 iCloud 的“不备份”?【英文标题】:iOS 5.0.1 : How to verify that the folder is marked as "Do not back up" for iCloud?iOS 5.0.1:如何验证文件夹是否标记为 iCloud 的“不备份”? 【发布时间】:2011-11-14 04:18:47 【问题描述】:

我想将Do not back up 设置为我在Document Directory 中的文件夹。

我找到了 "Do not back up" 的代码,但我如何验证该文件夹是否已被标记。

【问题讨论】:

你搞定了吗?我也在为 Documents 中的目录尝试类似的东西。我们必须对目录下的所有文件都这样做吗? @AppleDeveloper :是的,如果您不想在 iCloud 上备份,则必须标记您的目录。我试过这个。但等待苹果的评论。 酷。我也在等待苹果的评论。我在***.com/questions/8209755/… 给出了我的代码。如果您发现任何问题,请告诉我。谢谢。 【参考方案1】:

对于 ios 5.1,在模拟器中运行应用程序,然后在终端中运行以下命令:

xattr filename

如果项目被正确标记为排除,您应该会看到以下内容:

com.apple.metadata:com_apple_backup_excludeItem 

【讨论】:

如果我将“不备份”属性应用到一个目录,它上面的文件不会被同步?因为我将它应用于文件夹(../Library/Folder/file),当我使用“xattr ../Library/Folder”时,“com.apple.metadata:com_apple_backup_excludeItem”会出现,但是当我使用“xattr. ./Library/Folder/file" 它没有。 不做du -sk就不行——见@user353877回答【参考方案2】:

根据您链接的文档,如果您完全按照他们在该页面上列出的方式设置方法,如果属性标记正确,该方法将返回 YES

【讨论】:

好的。但是从文档中我发现Important: The new "do not back up" attribute will only be used by iOS 5.0.1 or later. On iOS 5.0 and earlier, applications will need to store their data in <Application_Home>/Library/Caches to avoid having it backed up. Since this attribute is ignored on older systems, you will need to insure your app complies with the iOS Data Storage Guidelines on all versions of iOS that your application supports. 所以我需要将文件夹位置更改为库以供Apple 批准。 您的应用可以检查操作系统版本并执行相应的操作。 如果我错了,请纠正我。似乎有三种情况:Pre 5.0、5.0 和 5.0.1。对于 5.0.1,您可以将文件夹标记为“离线数据”。在 5.0 中,iCloud 存在,但没有“不备份”解决方案,因此您必须将数据放在库/缓存中,在那里它将被清除:(。5.0 之前的版本没有 iCloud,AFAIK 数据不会被从 Documents 或 Caches 中清除,所以在这里也可以将数据放入 Caches 中是安全的。 @Michael 我的理解是,对于 Pre 5.0 for 5.0,您可以放置​​离线数据(可以下载或以其他方式重新创建的数据,但用户期望可靠脱机时可用)在 /Documents 目录或 /Library/Private Documents 目录中。它将被备份到 5.0 但没关系。 @NikolaiSander - 您是否验证了 Pre 5.0 和 5.0 可以通过 Apple 批准?我为 5.0.1 设置了“不备份”标志,但真的不想为 5.0 提供解决方案just【参考方案3】:
    打开模拟器 删除应用(应用审核团队将代码运行 1 次,因此请确保您从头开始) 现在在模拟器中运行您的代码,您的代码会将您的文件存储在您的硬盘上。 打开终端 cd /Users/(用户名)/Library/Application Support/iPhone Simulator/(ios version)/Applications ls 您将看到一个随机文件夹名称列表,打开每个文件夹,直到找到您的应用文件夹 对于 $(find *) 中的文件;做du -sk $文件; xattr -l $文件;回声;完成 您将看到应用程序中的所有文件,格式为.. (文件大小) (文件名) (iCloud 备份排除)

注意:如果未列出任何内容,则意味着该文件将被备份(如果它在 Library 或 Documents 文件夹中).. 如果您看到 'com.apple.metadata:com_apple_backup_excludeItem: com.apple.MobileBackup' 然后你可以走了。

【讨论】:

当我这样做时,我看到 'com.apple.MobileBackup:' 而不是 'com.apple.metadata:com_apple_backup_excludeItem: com.apple.MobileBackup'。这是否意味着未正确设置标志?我只是使用这里提供的方法来设置标志:developer.apple.com/library/ios/#qa/qa1719/_index.html xattr 总是不返回来自 iOS 模拟器的文件。这是否意味着没有“扩展属性”? 这对我有用,我必须这样做 du -sk 所以我认为这应该是公认的答案【参考方案4】:

在模拟器中运行应用程序,然后使用终端针对相关文件运行此命令:

xattr -plxv com.apple.MobileBackup <file name>

【讨论】:

谢谢,是什么?是我的应用程序名称吗?还是什么? xattr 总是不返回来自 iOS 模拟器的文件。这是否意味着没有“扩展属性”?【参考方案5】:

对于 iOS 5.1 或更高版本,此代码适用于我。

   - (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;
    

【讨论】:

Proactive Programmer 我装上 appDelegate 但苹果又拒绝了!!!奇怪的是我只是用 [NSbundle mainBundle] 加载文件;我不存储任何东西!你能帮我完成这个吗? 如果您使用 App 的 Document 目录来临时保存 App Bundle 中的文件,那么在这种情况下您可以使用 Cache 目录。如果您希望它永久存储,那么您甚至可以应用不备份整个目录的属性。

以上是关于iOS 5.0.1:如何验证文件夹是不是标记为 iCloud 的“不备份”?的主要内容,如果未能解决你的问题,请参考以下文章

高级表单验证 - 如何在用户完成后在字段旁边添加复选标记? --Javascript [关闭]

在 iOS Widgets 中,是不是必须将只读数据标记为 @State?

如何在循环中拆分和验证字符串是不是存在

如何判断文件是不是已通过 NSFileManager ios 上传

如何将 iPhone 应用程序从 Xcode 4.3.1 部署到具有 IOS 5.0.1 越狱的真实 iPhone 设备 [重复]

如何将 IBOutlet 标记为可用于特定 iOS 版本