【问题标题】:iOS App Rejection due to Data Storage Guidelines由于数据存储指南导致 iOS 应用被拒绝
【发布时间】:2016-08-21 07:04:47
【问题描述】:

2.23 详情

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

接下来的步骤

请确认只有用户使用您创建的内容 应用程序,例如文档、新文件、编辑等,由 iCloud 备份为 iOS 数据存储指南要求。另外,检查任何 您的应用程序使用的临时文件仅存储在 /tmp 目录;请记住删除或删除存储在 当确定不再需要它们时,此位置。

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

资源

检查您的应用存储了多少数据:

- Install and launch your app
- Go to Settings > iCloud > Storage > Manage Storage
- Select your device
- If necessary, tap "Show all apps"
- Check your app's storage

有关防止文件备份到的其他信息 iCloud 和 iTunes,请参阅技术问答 1719:如何防止文件从 正在备份到 iCloud 和 iTunes。

如果您在重现报告的问题时遇到困难,请尝试 测试技术问答 QA1764 中描述的工作流程:如何 重现针对 App Store 提交报告的错误。

我在互联网上搜索了很多关于这个问题的信息。现在好像很多人都遇到过这个问题。

按照他们的 Technical Q&A 1719 链接:如何防止文件备份到 iCloud 和 iTunes。我将 NSURLIsExcludedFromBackupKey 设置为 yes 以防止备份我的 CoreData 模型,因为这是我存储在应用程序 /Documents/ 中的唯一内容。

另一件事是我没有在我的应用程序中启用 CoreData,当我转到设置 > iCloud > 存储 > 管理存储时,我看不到我的应用程序。我只看到 TextEdit,我想是唯一使用 iCloud 的应用程序。我只在“设置”>“常规”>“存储和 iCloud 使用”>“管理存储”(但属于“存储”部分,而不是“iCloud”)> 下看到我的应用程序,并且在“文档和数据”下看到我使用的是 800Kb 而不是 6.32Mb(但显然是您使用该应用程序的次数越多,它下载和存储的次数就越多)。

我的应用程序不会从 Internet 下载任何图像,因此需要成为正在使用该空间的数据库。除了 CoreData,我使用 AFNetworking 和其他框架来显示 HUD 并在特定视图中制作 Excel 表格,但它们都没有下载东西,所以我 99% 确定 CoreData 模型正在使用该空间。

在将该键设置为 true 后,我再次发送了应用程序,但答案是相同的,具有相同数量的 Mb(扩展...),因为要实现下载的 Mb 量,用户应该浏览应用程序并我认为不同的测试人员不会进入完全相同的视图和选项。问题是他们回答说我不能发布我的应用程序。

还有什么我可以做的吗?因为我想存储应用程序从互联网下载的内容以将其用于离线模式并避免一直向服务器发出请求。

有什么建议吗?

提前致谢。

【问题讨论】:

标签: ios objective-c iphone core-data icloud


【解决方案1】:

如果你不需要备份CoreData store,即它只包含下载的可以再次下载的信息,并且不包含任何用户内容或设置,那么我建议你放置CoreData store在应用程序的缓存目录而不是文档目录中。缓存文件夹的内容没有备份到 iCloud。

将 CoreData 存储放置在 Documents 文件夹中时,根据您的设置,它可能会创建其他文件(二进制文件、日志文件等),并且这些文件可能会变得非常大。在主存储上应用NSURLIsExcludedFromBackupKey 标志不会影响这些附加文件,因此您仍然会被拒绝。

如果您要在 CoreData 中存储一些用户数据或设置,那么您可能需要备份这些数据。您可以考虑使用 CoreData 配置。这将允许您分解 CoreData 存储,以便可以备份用户信息,而下载的数据则不能。

【讨论】:

  • 但是我遍历了 /Documents 的所有文件,其中有 3 个文件,一个是我的 CoreData 模型,另外两个具有不同的结尾。我不仅为主商店设置了 NSURLIsExcludedFromBackupKey 。我更愿意知道如何更改设置和禁用日志、二进制文件等,而不是将 CoreData 移动到缓存。原因是一个实体几乎没有用户可以更改的属性。如果可能的话,我不想丢失该信息,并且我在互联网上进行了搜索,但他们不建议将 coredata 存储在缓存目录中。我看到 maeby 使用 coredata 库会更好。
  • 在将 CoreData 用作缓存时,将 CoreData 文件存储在缓存目录中是常见的做法。这正是该文件夹的用途。 CoreData 使用附加文件、二进制文件、日志文件等来提高效率,您不太可能想要关闭它们。如果要备份一个实体,请查看 CoreData 配置。它使您可以指定一个实体应该放在一个商店中,而其余实体应该放在主商店中。然后,您可以仅将其备份到那一家商店。请参阅:lists.apple.com/archives/Cocoa-dev/2005/Jul/msg02544.html 了解更多信息。
  • 我认为唯一的可能是将其移动到缓存,因为主要实体是用户可以修改某些属性的实体。所有其他实体都与此相关。我将尝试将 coredata 存储在缓存目录中。你有什么例子吗?
【解决方案2】:

我在Binary Rejected once again. How to do? 中回答了类似的问题。我也在这里发布相同的答案。

您错误地使用了 iCloud。 Apple 看到这个:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/iCloud.html

尊重用户的 iCloud 空间。重要的是要记住,iCloud 是用户付费的有限资源。您应该使用 iCloud 来存储用户创建和理解的信息,并避免使用它来存储您可以重新生成的应用程序资源或内容。另外,请注意,当用户的 iCloud 帐户处于活动状态时,iCloud 会自动备份应用程序 Documents 文件夹的内容。为避免占用过多的用户空间,最好对您放置在 Documents 文件夹中的内容有所挑剔。

使用最少的 iCloud 空间,避免使用 iCloud 来存储资源和其他数据,以便以后在 iCloud 空间中复制。

【讨论】:

  • 那么我认为他们会错误地拒绝您的应用程序。检查您从 Web 服务中提取的数据的大小。
  • 如果一切正常,请重新提交应用程序而不做任何更改。如果之前的拒绝是错误的,您的应用可能会被接受。
【解决方案3】:

几周前我也遇到了这个错误。使用下面的代码,您将摆脱该问题。在 info.plist 中添加“NSURLIsExcludedFromBackupKey”并将其值设置为“YES”。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.

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]);
    [URL resourceValuesForKeys:[NSArray arrayWithObject:NSURLIsExcludedFromBackupKey] error:nil];
}


return YES;
}

我通过这样做解决了这个问题。我的应用在应用商店被接受

【讨论】:

  • 但您的问题与将 CoreData 存储在 Documents 文件夹中有关吗?
  • 我从 Apple 那里得到了同样的错误。无论您是否使用核心数据,这段代码都会有所帮助,因为它也对我有帮助,而且我的应用在 iTunes 上被接受了
  • 正如我所说的那样,应用程序也被拒绝了,这可能与 Dave Wood 在他们的回答中所说的有关 CoreData 制作的二进制文件、日志文件等。这就是我问你是否也使用过 CoreData 的原因。
  • 这是一个糟糕的 hack。盲目地将文档文件夹中的所有文件标记为“从备份中排除”只是自找麻烦。
  • @DaveWood 是的,我知道这是一种不好的做法,但至少应该可以工作,但它不会因为 Apple 也拒绝了该应用程序。
猜你喜欢
  • 2012-09-12
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2012-09-04
相关资源
最近更新 更多