首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >由于iCloud数据存储指导原则,iPhone应用程序被拒绝

由于iCloud数据存储指导原则,iPhone应用程序被拒绝
EN

Stack Overflow用户
提问于 2012-07-07 20:24:17
回答 8查看 6.3K关注 0票数 18

我的一个应用程序的关键错误修复更新最近被拒绝,因为据称违反了iCloud数据存储指南。

以下是我的应用程序存储数据的方式(自从我的应用程序的第一个版本在2009年获得批准以来,一直没有问题):

  1. 在启动时,它会将一个"starter“SQLite3数据库从应用程序包复制到Documents文件夹中。
  2. 该数据库包含基本模式和一些示例数据,以便用户可以看到如何使用该应用程序。它很小-不到3MB。
  3. 用户将来的工作只保存在这个数据库文件中。他们可能会删除或保留样本,可能会添加大量自己的数据,但数据库文件将始终存在。

由于同样的原因,今年早些时候的一个更新被拒绝了,但当我给他们上面的解释时,应用程序的状态从“拒绝”变成了“正在审核中”,变成了“正在处理应用商店”。他们没有给我任何解释,所以我认为这只是审稿人的误会。

这一次,审阅者对我的解释的回应只是简单地说,非用户生成的数据不应该存储在iCloud中,我的更新仍然处于“拒绝”状态。

但我不明白我应该在这里做什么。因为用户的所有工作都保存在数据库中,所以我不能选择从iCloud备份中排除它或将其存储在缓存文件夹中。另外,我也不能很清楚地区分“用户生成”和“非用户生成”的数据,因为应用程序是从同一个数据库文件中运行的。尽管数据库的文件名和目录位置将保持不变,但初始的、非用户生成的数据将很快替换为用户自己的数据。

即使数据库中没有样本数据,任何数据库支持的应用程序在启动时仍然必须生成一个空数据库-即使它持有的唯一内容是应用程序的数据库模式。

这肯定是一个非常常见的问题,但不幸的是,对我来说,关闭备份是不行的--用户在存储在我的应用程序中的数据上投入了大量的工作,而iCloud备份对他们来说非常重要。

在这一点上我有什么选择?这是我能看到的:

  1. 再次联系苹果,并尝试解释发生了什么。
  2. 我是否可以将文件的备份属性设置为NO,然后仅当用户进行第一次更改时才将其切换为YES?这在技术上是可以的,并且可以从数据库中Apple?
  3. Remove我的示例数据。这对可用性真的很不好,还会增加我的支持负荷,但如果我的更新得到批准,我愿意这么做。但是,我仍然需要在启动时创建一个存根数据库来保存空的数据库模式,所以我不确定这是否会对approval process.
  4. Cry.

产生影响

有人有什么建议吗?我不得不想象,有很多其他的应用程序和我的一样使用数据库,但没有禁用备份的选项。

同样令人沮丧的是,我所做的任何更改都需要另一轮测试和应用程序审查,这将使我的关键更新再推迟2-3周。:/

更新:可能还有另一个选择:我可以简单地将文件保存在Library/中而不是Documents/中,因为它们的问题似乎是专门与使用Documents文件夹有关的?如果文件存储在Library/中,是否会备份该文件

UPDATE 2:我发现最令人困惑的事情是,任何数据库支持的应用程序(即使它使用核心数据)都必须创建一个至少包含应用程序模式的数据库文件。问题是我的数据库太大了吗?因为我看不出任何数据库支持的应用程序如何避免在启动时创建数据库。

更新3:我使用的是一个自定义的SQLite交互层,而不是核心数据。此外,示例数据由启动图像组成,当用户开始使用应用程序时,这些图像可能最终会被删除。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-07-09 23:11:08

3MB似乎相当多的样本数据存储在数据库中。如果您提取图像并将对图像的引用存储在数据库中,则应该能够将此使用率降低很多。然后,您可以将数据库的图像getter代码更改为如下所示:

代码语言:javascript
复制
- (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将由您的数据库提供支持。

通过以这种方式减少数据存储,您应该能够获得批准,因为您不会在手机上存储相对大量的数据。图像也可以通过这种方式放在应用程序包中,根本不需要复制。

票数 5
EN

Stack Overflow用户

发布于 2012-07-11 19:11:59

我有个非常愚蠢的想法。但也许它是有效的。

你可以在启动时显示一个弹出窗口,询问“你想让我创建一些演示数据吗”。当用户单击"Yes“时,其用户将生成数据。

票数 4
EN

Stack Overflow用户

发布于 2012-07-07 20:32:14

一种解决方法是从捆绑包中读取SQL文件,直到用户尝试编辑某些内容。然后把它复制过来。因为文件很小,所以它甚至不需要微调器。

最近,我在使用一个应用程序时遇到了这个问题。在我们的例子中,我们使用核心数据,并在启动时复制SQL文件。

不幸的是,你必须以iOS 5为目标。

https://developer.apple.com/library/ios/qa/qa1719/_index.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11374969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档