2

我的应用因以下原因被拒绝:

您的应用未按照 App Store 审核指南的要求遵守 iOS 数据存储指南。

您的应用在启动时会将 4.0 MB 的数据备份到每个用户的 iCloud 空间。请务必为所有非用户生成或修改的数据设置“不备份”属性。要检查您的应用存储了多少数据:

  • 安装并启动您的应用
  • 前往“设置”>“iCloud”>“存储和备份”>“管理存储”
  • 如有必要,选择“显示所有应用程序”
  • 检查您应用的存储空间

iOS 数据存储指南指出,只有用户使用您的应用程序创建的内容(文档、新文件、编辑等)可以存储在 /Documents 目录中 - 并备份到 iCloud。

您的应用程序使用的临时文件应仅存储在 /tmp 目录中。请记住在用户退出应用程序时删除存储在此位置的文件。

可以重新创建但必须保留以使您的应用程序正常运行或因为客户希望它可以离线使用的数据应附加“不备份”属性。对于 NSURL 对象,添加 NSURLIsExcludedFromBackupKey 属性以防止相应文件被备份。对于 CFURLRef 对象,使用相应的 kCFURLIsExcludedFromBackupKey 属性。

据我了解,存储在 /documents 文件夹中的所有内容都将存储在 iCloud 中,并且该文件夹应仅包含用户生成的数据。现在,我已将 /documents 中的所有文件移动到缓存文件夹中。但是,当我使用设备测试应用程序时,仍有大约 28kb 发送到 iCloud(据 Organizer 称,该设备的应用程序沙箱的 /documents 文件夹中没有任何内容)。我的项目不支持 iCloud,所以当文档中没有任何内容时,我不明白正在发送什么。

有没有办法检查发送到 iCloud 的确切内容?

另外,我现在的项目针对的是 iOS 5.0。根据我在 5.0 中的理解,没有任何东西可以防止最终清除缓存文件夹。我应该只支持 >= 5.0.1 吗?

4

2 回答 2

2

现在,我已将 /documents 中的所有文件移动到缓存文件夹中。

你错过了你引用的最后一段吗?如该段所述,您可以将数据标记为“不备份”。因此,请将您的文件留在 Documents 目录中并适当地标记它们。

有没有办法检查发送到 iCloud 的确切内容?

将浏览器指向http://developer.icloud.com

于 2012-07-03T17:34:55.280 回答
1

另外,我现在的项目针对的是 iOS 5.0。根据我在 5.0 中的理解,没有任何东西可以防止最终清除缓存文件夹。我应该只支持 >= 5.0.1 吗?

在 5.0 中无法执行此操作,因此您必须将所有内容存储在可能被操作系统清理的位置,例如NSCachesDirectory. 我认为您最好的选择是处理 5.0、5.0.1 和 5.1 的所有情况;用于NSCachesDirectory5.0 以及NSApplicationSupportDirectory5.0.1 和 5.1。这是一团糟,但正如您所指出的,Apple 很快在 5.0.1 中添加了新属性,并在 5.1 中再次改进了体验。

我们有应用被拒绝,因为我们没有处理所有不同的情况,YMMV。

但是,当我使用设备测试应用程序时,仍有大约 28kb 发送到 iCloud(据 Organizer 称,该设备的应用程序沙箱的 /documents 文件夹中没有任何内容)。我的项目不支持 iCloud,所以当文档中没有任何内容时,我不明白正在发送什么。

这适用于用户将他们的设备备份到 iCloud 的情况,而不适用于您在应用程序中使用 iCloud 的情况。我不会担心额外的 28KB,我在我们的应用程序中也看到了这一点,我认为这可能是第三方库(如分析包或在这些位置存储少量数据的其他项目)的开销。如前所述,NSUserDefaults 也可以存储在这里。如果您好奇,您可以从 Xcode 管理器下载数据并查看存储的内容。

这是 5.0.1 和 5.1 中处理不备份属性的方法。

+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
    if (&NSURLIsExcludedFromBackupKey == NULL) {
        // Use iOS 5.0.1 mechanism
        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 {
        // Use NSURLIsExcludedFromBackupKey mechanism, iOS 5.1+
        NSError *error = nil;
        BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES]
                                  forKey:NSURLIsExcludedFromBackupKey
                                   error:&error];
       //Check your error and take appropriate action
        return success;
    }
}
于 2012-07-03T20:13:22.250 回答