沙盒(SandBox)
iOS 应用沙盒机制就是指 iOS 应用程序只能在为该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。(ios8之前是这个样子,iOS8新开放了一种对几个固定系统区域的扩展机制 extension,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制)。应用沙盒机制下,每个应用程序都有自己的存储空间 ;应用程序不能翻过自己的围墙去访问别的存储空间的内容 ;应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
应用的沙盒结构如图:
应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(Caches/Preferences)、tmp。
1、Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。
2、Libaray/Caches:保存运行时产生的缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。
3、Libaray/Preferences:保存应用的所有偏好设置,iOS 的 Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。
4、tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用退出后,系统会清除该目录下的文件,iTunes不会同步该目录。
iOS路径获取方式:
项目中,为了方便我们开发方便,可以创建一个专门管理路径的类,示例:
// .h /** 路径管理者 */ @interface BDPathManager : NSObject /** * 获取沙盒Document的文件目录 * * @return 返回目录 */ + (NSString *)getDocumentDirectory; /** * 获取沙盒Library的文件目录 * * @return 返回目录 */ + (NSString *)getLibraryDirectory; /** * 获取沙盒Library/Caches的文件目录 * * @return 返回目录 */ + (NSString *)getCachesDirectory; /** * 获取沙盒Preference的文件目录 * * @return 返回目录 */ + (NSString *)getPreferencePanesDirectory; /** * 获取沙盒tmp的文件目录 * * @return 返回目录 */ + (NSString *)getTempDirectory;
// .m @implementation BDPathManager + (NSString *)getDocumentDirectory{ return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getLibraryDirectory{ return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getCachesDirectory{ return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getPreferencePanesDirectory{ return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getTempDirectory{ return NSTemporaryDirectory(); } @end
方便快速获得需要的路径!
苹果提供的函数:
/** * @brief 创建一个目录搜索路径列表 * * @param directory 文件类型(不同枚举值获取不同文件的路径)。 * @param domainMask 一般为 NSUserDomainMask,表示在用户文件夹下查找。 * @param expandTilde 一般为YES(NO,获取不到路径,而是在前面加了~) * * @return 返回存放路径的数组 */ NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);