我应该如何防止文件在iOS 5.0上备份到iCloud和iTunes?

时间:2012-10-19 09:24:47

标签: ios ios5 backup itunes icloud

我的应用需要从服务器下载相当数量的内容才能正常运行。

关于数据存储的Apple指南提到,这种“需要工作但很容易反映”的数据不应该包含在iCloud / iTunes备份中:足够公平。

棘手的部分是防止目录被备份的代码在iOS 5.0,5.0.1和5.1之间是不同的(参见this technical note)。

我的应用目前支持iOS 5.0作为部署目标。

我应该在以下不同选项之间做些什么:

  • 将部署目标设置为5.1 (直截了当但我无法找到有关仍然在iOS 5.0和5.0.1中的用户比例的数据,以便将主题介绍给我的老板)
  • Apple提供的
  • 实施5.0.1和5.1代码,但它引发了一些问题:
    • 我通常用来检测设备是否正在运行特定的iOS版本是使用respondsToSelector:iOS版本中引入的选择器我的目标是iOS 5.1 seems to introduce constants and not-universal classes only。如何确定我正在运行iOS 5.1或更高版本?
    • 运行iOS 5.0的设备怎么样?将数据存储到缓存中对于开发团队和用户体验来说都非常烦人。

还有其他推荐选项吗?

3 个答案:

答案 0 :(得分:0)

对于存储到文件系统的每个文件,您必须添加“不备份”属性。请参阅此答案:Adding the "Do Not Backup" attribute to a folder hierarchy in iOS 5.0.1。要检查系统版本,您可以拨打[[UIDevice currentDevice] systemVersion],或使用__IPHONE_5_0#if defined()以及#ifndef等宏。祝你好运!

答案 1 :(得分:0)

我正在将我的图片文件夹标记为不备份,因为我正在下载图片以供离线使用。 Here苹果讨论如何这样做。

#include<sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
    if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1
        const char* filePath = [[URL path] fileSystemRepresentation];

        const char* attrName = "com.apple.MobileBackup";
        u_int8_t attrValue = 1;

        int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
        return result == 0;
    } else { // iOS >= 5.1
        NSError *error = nil;
        [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
        return error == nil;
    }
}

- (void)createSkipBackupImagesFolder {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/images"];

    NSError *error;
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error];
        NSURL *toURL = [NSURL fileURLWithPath:dataPath];
        [self addSkipBackupAttributeToItemAtURL:toURL];
    }
}

[self createSkipBackupImagesFolder];

答案 2 :(得分:-1)

如果您将数据存储到缓存目录而不是文档目录中,则icloud将不会备份您的数据...

所以我认为这是阻止icloud备份的最佳方法。

in&#34;不备份&#34;您需要为每个文件设置此标志。

使用NSCachesDirectory insted NSDocumentDirectory。