ios - iPhone应用程序因iCloud数据存储准则而被拒绝

标签 ios iphone app-store

由于涉嫌违反iCloud数据存储准则,最近拒绝了对我的一个应用程序进行的重要错误修正更新。

这是我的应用存储数据的方式(自2009年批准第一版应用以来,这一直不是问题):

  • 在启动时,它将“启动器” SQLite3数据库从应用程序 bundle 包复制到Documents文件夹。
  • 该数据库包含基本架构和一些示例数据,因此用户可以查看如何使用该应用程序。它很小-不到3MB。
  • 然后,用户的将来工作仅保存在此数据库文件中。他们可能会删除或保留样本,他们可能会添加大量自己的数据,但是该数据库文件将始终存在。

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

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

    但是我不明白我应该在这里做什么。因为所有用户的工作都保存在数据库中,所以我不能选择将其从iCloud备份中排除或将其存储在Cache文件夹中。而且,我无法真正将“用户生成的”数据与“非用户生成的”数据完全区分开,因为该应用程序是在同一数据库文件中工作的。尽管数据库的文件名和目录位置将保持不变,但最初的非用户生成数据将被用户自己的数据快速替换。

    即使数据库中没有示例数据,任何数据库支持的应用程序启动时仍将必须生成一个空数据库-即使它持有的唯一内容是该应用程序的数据库架构。

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

    我现在有什么选择?这是我所看到的:
  • 再次联系Apple,并尝试解释发生了什么。
  • 我可以将文件的备份属性设置为NO,然后仅在用户进行第一次更改时将其切换为YES吗?从技术上讲,这对苹果还可以吗?
  • 从数据库中删除我的示例数据。这确实对可用性不利,并且会增加我的支持负荷,但是如果它可以批准我的更新,我愿意这样做。但是,我仍然必须在启动时创建一个 stub 数据库来保存空的数据库架构,因此我不确定这是否会对批准过程产生影响。
  • 哭。

  • 有人有什么建议吗?我必须想象,还有许多其他应用程序都使用与我相同的方式使用数据库,但是没有选择禁用备份。

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

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

    更新2 :我发现最令人困惑的是,任何数据库支持的应用程序(即使我假设它使用的是Core Data)都必须创建一个至少包含该应用程序架构的数据库文件。问题仅仅是我的数据库太大吗?因为我看不到任何数据库支持的应用程序如何避免在启动时不得不创建数据库。

    更新3 :我使用的是自定义SQLite交互层-不是Core Data。同样,示例数据由启动器图像组成,用户在开始使用该应用程序时可能会最终将其删除。

    最佳答案

    3MB似乎在数据库中存储了很多示例数据。如果您拔出图像并将对图像的引用存储在数据库中,则应该可以大大降低这种用法。然后,您可以将数据库的图像获取程序代码更改为如下所示:

    - (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将由您的数据库支持。

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

    关于ios - iPhone应用程序因iCloud数据存储准则而被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374969/

    相关文章:

    ios - 为什么我的自定义注释图像会发生变化?

    ios - 从现有 phAsset 修改元数据似乎不起作用

    ios - 多个 iOS 分发证书问题

    ios - 是否可以根据国家/地区更改 iPhone 应用程序描述措辞

    iphone - 防止 VoiceOver 显示位于较大透明 View 下方的 View

    ios - 应用程序包含在线视频和离线服务。 Apple 是怎么定义 30% 收费的呢?

    ios - 如何使用 plutil 编辑 .plist 文件中数组包含的字典的键值对

    iphone - iOS Sprite Kit 如何水平反射 Sprite ?

    iphone - 如何在Xcode中安装证书(准备应用商店提交)

    app-store - 我可以在 iTunes Connect 上更改我的应用程序的类别吗?