由于涉嫌违反 iCloud 数据存储指南,我最近拒绝了对我的一个应用程序的重要错误修复更新。
这是我的应用程序存储数据的方式(自从我的应用程序的第一个版本于 2009 年获得批准以来一直没有问题):
- 启动时,它会将“starter”SQLite3 数据库从应用程序包复制到 Documents 文件夹。
- 该数据库包含基本架构和一些示例数据,因此用户可以了解如何使用该应用程序。它很小 - 不到 3MB。
- 用户未来的工作只保存在这个数据库文件中。他们可能会删除或保留样本,他们可能会添加大量自己的数据,但该数据库文件将始终存在。
今年早些时候的一次更新因为同样的原因被拒绝了,但是当我给他们上面的解释时,应用程序状态从“拒绝”变成了“审查中”,变成了“正在处理 App Store”。他们没有给我任何解释,所以我认为这只是审稿人的误解。
这一次,审阅者对我的解释做出了简单的回应,即非用户生成的数据不应存储在 iCloud 中,我的更新仍处于“拒绝”状态。
但我不明白我应该在这里做什么。因为所有用户的工作都保存在数据库中,所以我不能将其从 iCloud 备份中排除或将其存储在缓存文件夹中。此外,我无法真正将“用户生成”数据与“非用户生成”数据完全分开,因为该应用程序使用同一个数据库文件。尽管数据库的文件名和目录位置将保持不变,但初始的、非用户生成的数据将很快被用户自己的数据替换。
即使数据库中没有样本数据,任何由数据库支持的应用程序在启动时仍然必须生成一个空数据库——即使它唯一拥有的是应用程序的数据库模式。
这一定是一个非常普遍的问题,但不幸的是,我不能只关闭备份——用户在他们存储在我的应用程序中的数据上投入了大量工作,而 iCloud 备份对他们来说非常重要。
在这一点上我有什么选择?这是我能看到的:
再次联系 Apple 并尝试解释发生了什么。
我可以将文件的备份属性设置为 NO,然后仅在用户进行第一次更改时将其切换为 YES 吗?这在技术上可以吗,对苹果来说还可以吗?
从数据库中删除我的示例数据。这对可用性真的很不利,并且会增加我的支持负担,但如果它能让我的更新获得批准,我愿意这样做。但是,我仍然需要在启动时创建一个存根数据库来保存空的数据库模式,所以我不确定这是否会对审批过程产生影响。
哭。
有人有什么建议吗?我不得不想象有很多其他应用程序使用数据库的方式与我的方式相同,但没有仅禁用备份的选项。
同样令人沮丧的是,我所做的任何更改都需要另一轮测试和应用程序审查,这将使我的关键更新延迟 2 到 3 周。:/
更新:可能还有另一种选择:我可以简单地将文件保存在Library/
而不是Documents/
,因为他们的问题似乎与使用 Documents 文件夹有关吗?如果文件存储在 中,是否会备份文件Library/
?
更新2:我发现最令人困惑的是任何数据库支持的应用程序(即使它使用Core Data,我假设)都必须创建一个至少包含应用程序架构的数据库文件。问题只是我的数据库太大了吗?因为我看不到任何数据库支持的应用程序如何避免在启动时创建数据库。
更新 3:我使用的是自定义 SQLite 交互层——不是核心数据。此外,示例数据包含初始图像,用户在开始使用应用程序时可能最终会删除这些图像。