iOS 数据存储指南快速指南
很多人都遇到了这个问题,而且审核团队似乎经常自动声称您的应用不遵循 iOS 存储指南。无论哪种方式,您都需要记录您的应用程序将数据存储在何处以及哪些数据存储在何处。这是一个快速指南,可以帮助您入门。
您的应用可以将文件存储在 /Documents、/Library 或 /tmp 中。
文件/
使用此目录来存储用户生成的内容。该目录的内容可以通过文件共享提供给用户;因此,他的目录应该只包含您可能希望向用户公开的文件。
此目录的内容由 iTunes 备份。
图书馆/
这是任何非用户数据文件的顶级目录。您通常将文件放在几个标准子目录之一中。 iOS 应用程序通常使用 Application Support 和 Caches 子目录;但是,您可以创建自定义子目录。
将库子目录用于您不希望向用户公开的任何文件。您的应用不应将这些目录用于用户数据文件。
Library 目录的内容(Caches 子目录除外)由 iTunes 备份。
tmp/
使用此目录来编写不需要在应用启动之间保留的临时文件。当不再需要文件时,您的应用应从该目录中删除文件;但是,当您的应用程序未运行时,系统可能会清除此目录。
iTunes 不备份此目录的内容。
将用户数据放入 Documents/。
这是由 iTunes/iCloud 备份的
将应用创建的支持文件放入库/应用程序支持/
这是由 iTunes/iCloud 备份的
将临时数据放入 tmp/ 目录。
这不是由 iTunes/iCloud 备份的
但我如何知道我的文件存储在哪里?
将下面的脚本放入 appDelegate 文件中的 func application: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 审核团队写一份文件,并记录你的应用程序对存储空间的使用情况。从上面脚本生成的日志中截取屏幕截图。
我的应用保存了大量用户创建的数据
如果您的应用程序将用户的数据保存到 Documents/ 中,这很好,并编写一个文档记录用户制作的文档,并遵循 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 堆栈时牢记这一事实是个好主意。
当您保存托管对象上下文时,Core Data 在普遍存在的容器中创建一组事务更改,这些更改保证可以一起应用于其他对等方。此事务集的大小以及保存上下文的频率都会直接影响应用的性能。
资源:
iOS Data Storage Guidelines - Apple Developer
iCloud Programming Guide for Core Data
File System Programming Guide