1、APP沙盒目录结构简介
首先奉上苹果官方文档:
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html
在iOS系统的安全机制,每个APP都有自己的文件目录,且只能访问自己的文件目录。该机制被称为沙盒机制。
沙盒文件结构如下:
最上面的bundle container目录为APP程序的安装目录,在安装后为不可修改状态。(用于存放程序源文件,上架前经过数字签名,上架后不能修改)
中间的data container目录为APP数据存储目录,保存APP运行时需要的数据。
最下面的iCloud container目录为云存储目录,当APP需要iCloud云存储时可以进行访问。
2、data container目录介绍
开发中最常用到的是data container目录,系统在安装APP时就为用户创建了几个固定的目录供编程人员使用。初始化时的目录结构如下:
※Documents
保存用户创建的文档文件的目录,用户可以通过文件分享分享该目录下的文件。在iTunes和iCloud备份时会备份该目录。建议保存你希望用户看得见的文件。(不能用于存放缓存文件,否则上架不通过)
※Library
苹果不建议在该目录下保存任何用户相关数据,而是保存APP运行需要的修改数据,当然用户可以根据自己的实际需要进行保存。
该目录下默认有两个子目录,为Caches、Preferences。根据文档还有另外两个系统预存放文件的子目录,分别是Application Support、Frameworks。用户还可以自己根据需要创建相应的目录。该目录下除Caches目录外,在iTunes和iCloud备份时会备份除Caches目录外的其他所有目录。四个目录的预定义如下:
Cache:建议保存数据缓存使用。在用户的磁盘空间已经使用完毕时有可能删除该目录下的文件,在APP使用期间不会删除,APP没有运行时系统有可能进行删除。需要持久化的数据建议不要保存在该目录下,以免系统强制删除。
Preferences:用户偏好存储目录,在使用NSUserDefaults或者CFPreferences接口保存的数据保存在该目录下,编程人员不需要对该目录进行管理。在iTunes和iCloud备份时会备份该目录。
Application Support:建议用来存储除用户数据相关以外的所有文件,如游戏的新关卡。在iTunes和iCloud备份时会备份该目录。
Frameworks:用来保存动态库的文件夹,在iOS系统中已不能使用,该目录可以忽略。
※tmp
苹果建议该目录用来保存临时使用的数据,编程人员应该在数据长时间内不使用时主动删除该目录下的文件,在APP没有运行期间,系统可能删除该目录下的文件。在iTunes和iCloud备份时不会备份该目录。
综上所述,我们保存文件可以保存在Application Support或者Documents目录之下,临时缓存文件则可根据需要保存到tmp和Cache目录下面,由于tmp和Cache目录有可能被系统删除,所有不能保存重要的文件数据。
除系统推荐的目录之外,用户也可以自己创建目录,也可以在推荐的目录下创建子目录进行管理。
3、目录路径获取
获取路径方法如下:
//沙盒根目录
NSString *homePath = NSHomeDirectory();
//document目录
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//library目录
NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
//caches目录
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
//application support目录
NSString *applicationSupportPath = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES).firstObject;
//preference目录
NSString *preferencePath = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES).firstObject;
//tem目录
NSString *temPath = NSTemporaryDirectory();