防止iCloud同步数据(使用.nosync?)

And*_*son 22 iphone cocoa-touch objective-c ios5

编辑:到目前为止,我能够提出的最好的是一个弹出窗口,要求用户禁用iCloud同步,同时将所有数据移动到Documents目录,这样就不会被擦除:在iOS5中,是否可以检测用户是否设置了备份应用程序?

我为iPhone/iPad开发了离线地图应用程序.

我们曾经在Caches目录中存储了所有数据(可能有很多演出).

从iOS5开始,当用户的硬盘驱动器开始变满时,可以随机删除Caches目录中的文件.

如何在不将数据同步到iCloud,iTunes且不随机删除的情况下存储本地数据?我的本地数据是一个包含许多小数据文件的大型目录树,存在于数千个子目录中.

我将目录树从库缓存目录移动到文档目录中的data.nosync目录,因为我们已经读过这可能是一个解决方案.但是,nosync文件夹中的数据仍将备份到iCloud.

现在我创建目录:

NSString* noSyncDirectory() {
  static NSString *directory = nil;
  if (!directory) {
    directory = [[NSString stringWithFormat:@"%@/%@",
                  documentsDirectory(), @"data.nosync"] retain];
    [Constants createDirectoryIfNeeded:directory];
  }
  return directory;
}
Run Code Online (Sandbox Code Playgroud)

Bad*_*ate 13

来自:https://developer.apple.com/library/ios/#qa/qa1719/_index.html

您可以使用以下方法设置"不备份"扩展属性.每当您创建不应备份的文件或文件夹时,请将数据写入文件,然后调用此方法,并将URL传递给该文件.

#include <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    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;
}
Run Code Online (Sandbox Code Playgroud)

可以找到更多信息:https://developer.apple.com/icloud/documentation/data-storage/

此外,注意:当开发者文档错误地暗示("这些文件将不被清除,将不会被包含在用户的iCloud或iTunes备份")的DO-没有备份标志兼作拒收清除标志事实并非如此.只需将文件保留在缓存目录中并将其标记为"不备份"就不会阻止其擦除.

  • +1,但应该指出,这仅适用于iOS 5.0.1以上(因此所有其他答案). (3认同)