我的一个应用程序的关键错误修复更新最近被拒绝,因为据称违反了iCloud数据存储指南。
以下是我的应用程序存储数据的方式(自从我的应用程序的第一个版本在2009年获得批准以来,一直没有问题):
由于同样的原因,今年早些时候的一个更新被拒绝了,但当我给他们上面的解释时,应用程序的状态从“拒绝”变成了“正在审核中”,变成了“正在处理应用商店”。他们没有给我任何解释,所以我认为这只是审稿人的误会。
这一次,审阅者对我的解释的回应只是简单地说,非用户生成的数据不应该存储在iCloud中,我的更新仍然处于“拒绝”状态。
但我不明白我应该在这里做什么。因为用户的所有工作都保存在数据库中,所以我不能选择从iCloud备份中排除它或将其存储在缓存文件夹中。另外,我也不能很清楚地区分“用户生成”和“非用户生成”的数据,因为应用程序是从同一个数据库文件中运行的。尽管数据库的文件名和目录位置将保持不变,但初始的、非用户生成的数据将很快替换为用户自己的数据。
即使数据库中没有样本数据,任何数据库支持的应用程序在启动时仍然必须生成一个空数据库-即使它持有的唯一内容是应用程序的数据库模式。
这肯定是一个非常常见的问题,但不幸的是,对我来说,关闭备份是不行的--用户在存储在我的应用程序中的数据上投入了大量的工作,而iCloud备份对他们来说非常重要。
在这一点上我有什么选择?这是我能看到的:
产生影响
有人有什么建议吗?我不得不想象,有很多其他的应用程序和我的一样使用数据库,但没有禁用备份的选项。
同样令人沮丧的是,我所做的任何更改都需要另一轮测试和应用程序审查,这将使我的关键更新再推迟2-3周。:/
更新:可能还有另一个选择:我可以简单地将文件保存在Library/
中而不是Documents/
中,因为它们的问题似乎是专门与使用Documents文件夹有关的?如果文件存储在Library/
中,是否会备份该文件
UPDATE 2:我发现最令人困惑的事情是,任何数据库支持的应用程序(即使它使用核心数据)都必须创建一个至少包含应用程序模式的数据库文件。问题是我的数据库太大了吗?因为我看不出任何数据库支持的应用程序如何避免在启动时创建数据库。
更新3:我使用的是一个自定义的SQLite交互层,而不是核心数据。此外,示例数据由启动图像组成,当用户开始使用应用程序时,这些图像可能最终会被删除。
发布于 2012-07-09 23:11:08
3MB似乎相当多的样本数据存储在数据库中。如果您提取图像并将对图像的引用存储在数据库中,则应该能够将此使用率降低很多。然后,您可以将数据库的图像getter代码更改为如下所示:
- (UIImage *)image
{
NSString *imageName = self.imageName;
UIImage *image = [UIImage imageNamed:imageName];
if (!image)
{
NSString *imageLibraryPath = ...;
image = [UIImage imageWithPath:[imageLibraryPath stringByAddingPathComponent:imageName]];
}
return image;
}
- (void)setImage:(UIImage *)image
{
[self setImageData:UIImagePNGRepresentation(image)];
}
- (void)setImageData:(NSData *)imageData
{
NSString *imageLibraryPath = ...;
NSString *fileName = self.uniqueId; //or something else, UUID maybe?
NSString *filePath = [imageLibraryPath stringByAddingPathComponent:imageName];
[imageData writeToFile:filePath atomically:YES]; // maybe dispatch_async this into the background?
self.fileName = fileName;
}
self.fileName
将由您的数据库提供支持。
通过以这种方式减少数据存储,您应该能够获得批准,因为您不会在手机上存储相对大量的数据。图像也可以通过这种方式放在应用程序包中,根本不需要复制。
发布于 2012-07-11 19:11:59
我有个非常愚蠢的想法。但也许它是有效的。
你可以在启动时显示一个弹出窗口,询问“你想让我创建一些演示数据吗”。当用户单击"Yes“时,其用户将生成数据。
发布于 2012-07-07 20:32:14
一种解决方法是从捆绑包中读取SQL文件,直到用户尝试编辑某些内容。然后把它复制过来。因为文件很小,所以它甚至不需要微调器。
最近,我在使用一个应用程序时遇到了这个问题。在我们的例子中,我们使用核心数据,并在启动时复制SQL文件。
不幸的是,你必须以iOS 5为目标。
https://developer.apple.com/library/ios/qa/qa1719/_index.html
https://stackoverflow.com/questions/11374969
复制相似问题