由于未遵循iOS应用程序数据存储指南,我的应用程序遭到拒绝

我的应用因未遵循iOS应用数据存储指南而被拒绝。 我的二进制文件被苹果App Store审查小组拒绝。

在启动和内容下载时,您的应用程序在用户的iCloud上存储6.34MB,不符合iOS数据存储指南。

下一步

请确认只有用户使用您的应用程序创build的内容(如文档,新文件,编辑等)由iCloud根据iOS数据存储指南的要求进行备份。 此外,请检查您的应用程序使用的任何临时文件只存储在/ tmp目录; 请记住删除或删除存储在这个位置的文件,当它被确定不再需要时。

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

我该怎么办?

iOS数据存储指南快速指南

很多人都遇到了这个问题,审查小组似乎经常自动声称您的应用不遵循iOS存储指南。 无论哪种方式,你需要logging你的app store的数据和什么数据存储在哪里。 这里有一个快速指南,应该让你开始。

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

iOS文件系统存储

文件/

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

图书馆/

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

TMP /

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


将用户数据放在Documents /中。 这由iTunes / iCloud备份

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

将临时数据放入tmp /目录。 这不是由iTunes / iCloud备份的

但是,如何找出我的文件存储在哪里?

把脚本咆哮在func应用程序中:didFinishLaunchingWithOptions在你的appDelegate文件中。 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)") } } 

我的应用程序不保存任何东西

幸运的是…给苹果审查团队写一份文件,并logging你的应用程序使用存储。 从上面的脚本制作的日志中截图。

我的应用程序保存了很多用户创build的数据

如果您的应用程序将用户的数据保存到Documents /文档中,并且编写文档logging这是由用户制作的,并遵循iOS数据存储指南。

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

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


我在Documents / or Library /中有文件,但我不想备份它们

从iOS 5.1开始,应用程序可以使用NSURLIsExcludedFromBackupKey或kCFURLIsExcludedFromBackupKey文件系统属性从备份中排除文件和目录。 需要排除大量文件的应用程序可以通过创build自己的子目录并将该目录标记为排除在外来排除这些文件。 应用程序应创build自己的目录进行排除,而不是排除系统定义的目录。 这些API中的任何一个都比较早的,不推荐的直接设置扩展属性的方法更受欢迎。 在iOS 5.1及更高版本上运行的所有应用程序都应使用这些API从备份中排除数据。

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

 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 } } 

如果您认为您的应用拒绝是错误的,请回顾评估小组,并说明情况和存储的使用情况


简单的准则

带宽,networking可用性和存储资源有限,对您的用户有实际的财务影响。 在devise模式时,请仅在iCloud中存储无法重新创build的信息。

启用iCloud的核心数据应用程序不仅知道在设备上创build的数据,而且还知道其他设备上的数据。 在deviseCore Data堆栈时,记住这个事实是一个好主意。

在保存托pipe对象上下文时,核心数据将在无处不在的容器中创build一组保证在其他对等体上一起应用的事务更改。 这个事务集的大小以及保存上下文的频率都会直接影响您的应用程序的性能。


资源:

iOS数据存储指南 – 苹果开发者

核心数据的iCloud编程指南

文件系统编程指南