iCloud 中保存的意外数据

Posted

技术标签:

【中文标题】iCloud 中保存的意外数据【英文标题】:Unexpected data saved in iCloud 【发布时间】:2016-01-24 12:10:34 【问题描述】:

由于以下原因,我的一个应用刚刚被拒绝:

2.23 - 应用必须遵循 ios 数据存储指南,否则将被拒绝

2.23 详情

在启动和内容下载时,您的应用会在用户的 iCloud 上存储 103.72 MB,这不符合 iOS 数据存储指南。

我检查了我的 iPhone,我的应用确实将 200 多 MB 的数据保存到了 iCloud。但是,我很确定我的应用程序中的所有数据都使用 Core Data 保存,并且该应用程序甚至没有在“功能”选项卡中打开 iCloud。那么有没有办法找出这些数据来自哪里?或者您能否提出一些可能导致此问题的原因,以便我进行调查?

编辑

抱歉,我在 Apple 的反馈中遗漏了一行:

有关防止文件备份到 iCloud 和 iTunes 的更多信息,请参阅Technical Q&A 1719: How do I prevent files from being backed up to iCloud and iTunes。

所以我认为审稿人的实际意思是备份了一些不应该备份到iCloud的数据,所以我需要做的就是这样:

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString 
    NSURL* URL= [NSURL fileURLWithPath: filePathString];
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                              forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success)
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    
    return success;

【问题讨论】:

【参考方案1】:

这是一个很常见的问题。

您可以使用application:didFinishLaunchingWithOptions:中的以下代码查看有关iCloud备份的各项权限:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSArray *documents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:basePath error:nil];
NSURL *URL;
NSString *completeFilePath;

for (NSString *file in documents) 
    completeFilePath = [NSString stringWithFormat:@"%@/%@", basePath, file];
    URL = [NSURL fileURLWithPath:completeFilePath];
    NSLog(@"File %@  is excluded from backup %@", file, [URL resourceValuesForKeys:
                                                          [NSArray arrayWithObject:NSURLIsExcludedFromBackupKey] 
                                                                             error:nil]);

如果您注意到某些文件正在与 iCloud 同步,您可以将 NSURLIsExcludedFromBackupKey 的资源值设置为 YES 以排除 iCloud 备份这些文件,而不是将这些文件保存在其他位置

像这样:

NSURL *URL = [NSURL fileURLWithPath:photoPath];
[URL setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:nil];

【讨论】:

感谢您的回答。我刚刚发现我错过了 Apple 反馈中的一行(我已经编辑了问题)。对此感到抱歉。 我的情况是我在文档中找不到任何文件,备份大小是几KB..

以上是关于iCloud 中保存的意外数据的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - iCloud 行为

iCloud保存数据与UIDocument崩溃

核心数据 - 通过 iCloud 保存和共享图像

在 iCloud 上下载保存的数据

如何将获取的 iCloud 数据对象保存到单个数组中?

我如何在 iCloud 中保存 NSData