由于未遵循iOS应用数据存储指南,我的应用被拒绝了

时间:2016-05-19 18:38:25

标签: ios icloud data-storage

由于未遵循iOS应用数据存储指南,我的应用遭到拒绝。 我的二进制文件被Apple App Store评论小组拒绝了。

  

在发布和内容下载时,您的应用会在用户的iCloud上存储6.34MB,这不符合iOS数据存储指南。

     

后续步骤

     

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

     

可以重新创建但必须保持应用程序正常运行的数据 - 或者因为用户希望它可供离线使用 - 应标记为"不要备份"属性。对于NSURL对象,请添加NSURLIsExcludedFromBackupKey属性以防止备份相应的文件。对于CFURLRef对象,请使用相应的kCRUFLIsExcludedFromBackupKey属性。

我该怎么办?

1 个答案:

答案 0 :(得分:7)

iOS数据存储指南快速指南

很多人遇到此问题,而且审核小组似乎自动声称您的应用不符合iOS存储指南。无论哪种方式,您都需要记录应用程序存储数据的位置以及存储在哪里的数据。这是一本快速指南,可以帮助您入门。

您的应用可以将文件存储在/ Documents,/ Library或/ tmp。

iOS File System Storage

<强>文档/

  

使用此目录存储用户生成的内容。该目录的内容可以通过文件共享提供给用户;因此,他的目录应该只包含您可能希望向用户公开的文件。   该目录的内容由iTunes备份。

<强>库/

  

这是非用户数据文件的任何文件的顶级目录。您通常将文件放在几个标准子目录之一中。 iOS应用程序通常使用Application Support和Caches子目录;但是,您可以创建自定义子目录。   对于您不希望向用户公开的任何文件,请使用Library子目录。您的应用不应将这些目录用于用户数据文件。   Library目录的内容(Caches子目录除外)由iTunes备份。

<强> TMP /

  

使用此目录编写临时文件,这些文件无需在启动应用程序之间保留。您的应用应该在不再需要时删除此目录中的文件;但是,当您的应用未运行时,系统可能会清除此目录。   iTunes不会备份此目录的内容。

  

将用户数据放入Documents /.   由iTunes / iCloud备份

     

将应用程序创建的支持文件放入库/应用程序支持/   由iTunes / iCloud备份

     

将临时数据放入tmp /目录。    iTunes / iCloud不支持

但是如何找出我的文件存储位置?

将脚本放在你的appDelegate文件中的func应用程序:didFinishLaunchingWithOptions中。 NSSearchPathDirectory是一个枚举,代表不同的文件夹/位置。其中一些就是这些。

public enum NSSearchPathDirectory : UInt {
case DocumentDirectory 
case LibraryDirectory

}

将NSSearhPathDirectory(.DocumentDirectory)更改为所需的位置,并检查您在那里存储的文件。

let paths: NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true)
    if let documentDirectory = paths.firstObject{
        do{
            let documents = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentDirectory as! String)

            for files in documents {
                let urlForm = NSURL.fileURLWithPath((documentDirectory as! String) + "/" + files)

                do{
                    try print("\(files): \(urlForm.resourceValuesForKeys([NSURLIsExcludedFromBackupKey])), with filepath: \(urlForm)")
                 //Prints out folder and files in the desired location

                } catch let error as NSError{
                    print("Can't find key: \(error)")
                }

            }

        }catch let error as NSError{
            print("Can't retrieve contents: \(error)")
        }
    }

我的应用不保存任何内容

很幸运...将文档写入Apple审核小组并记录您的应用程序对存储的使用情况。从上面脚本中的日志中截取屏幕截图。

我的应用会保存大量用户创建的数据

如果您的应用将用户的数据保存到文档/那很好,并写一份文档,记录这是由用户制作的,并遵循iOS数据存储指南。

如果您的应用下载数据并将其保存到错误的位置

只需遵循iOS数据存储指南并提交新的二进制文件即可。

我在Documents /或Library /中有文件,但我不想备份

  

从iOS 5.1开始,应用可以使用NSURLIsExcludedFromBackupKey或kCFURLIsExcludedFromBackupKey文件系统属性从备份中排除文件和目录。需要排除大量文件的应用可以通过创建自己的子目录并将该目录标记为已排除来排除它们。应用程序应创建自己的排除目录,而不是排除系统定义的目录。与直接设置扩展属性的旧的,不推荐使用的方法相比,这两种API都是首选。在iOS 5.1及更高版本上运行的所有应用都应使用这些API从备份中排除数据。

我已经创建了一个快速脚本来处理您不想备份的文件。

func addSkipBackupAttributeToItemAtPath(filepath: String)-> Bool {

if let url: NSURL = NSURL(fileURLWithPath: filepath) {
    let exist = NSFileManager.defaultManager().fileExistsAtPath(String(url))

    if exist{
        do
        {
            try url.setResourceValues(["YES" : "NSURLIsExcludedFromBackupKey"])
            return true
        }
        catch let error as NSError
        {
            print("\(error)")
            return false

        }

    } else
    {
        print("File does not exist")
        return false
    }

} else
{
    print("Path not recognized")
    return false
}
}

如果您认为自己的应用被拒绝,请写回审核小组并解释情况和您对存储的使用

简单指南

  

带宽,网络可用性和存储资源有限,对您的用户产生实际的财务影响。设计架构时,仅在iCloud中存储无法重新创建的信息。

     启用iCloud的核心数据应用程序不仅可以识别设备上创建的数据,还可以识别其他设备上的数据。在设计Core Data堆栈时,记住这一事实是个好主意。

     

当您保存托管对象上下文时,Core Data会在ubiquity容器中创建一组保证在其他对等方上一起应用的事务更改。此交易集的大小以及保存上下文的频率都会直接影响应用的效果。

资源:

iOS Data Storage Guidelines - Apple Developer

iCloud Programming Guide for Core Data

File System Programming Guide