免费开源的iOS开发学习平台

沙盒SandBox:1-沙盒基础

在iOS的开发过程中,我们常常会遇到数据持久化存储方面的问题,而数据持久化的基础是建立在iOS的沙盒机制上的,所以深入理解iOS的沙盒机制是很有必要的。

什么是沙盒

iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在该应用的文件夹内读取文件,不可以访问其他区域的内容,此区域被成为沙盒。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。

  • 每个应用程序都有自己的存储空间
  • 应用程序不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
  • 应用程序向外请求或接收数据都需要经过权限认证

正是因为沙盒机制的存在,iOS以及MacOS的软件安全性要比Android以及Windows应用的安全性高。

沙盒目录介绍

默认情况下,每个App应用的沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在这几个目录下读写文件。iTunes在与iPhone同步时,会备份所有的Documents和Library文件。iPhone在重启时,会丢弃所有的tmp文件。

  • Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

  • Library:存储程序的默认设置或其它状态信息,其中又包含了Caches文件夹和Preferences文件夹

  • Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出时删除

  • Library/Preferences:存放偏好设置的plist文件

  • tmp:提供一个即时创建临时文件的地方

获取沙盒中文件夹的路径

  • App沙盒的路径
    NSString *homePath = NSHomeDirectory();
    NSLog(@"沙盒路径:%@", homePath);

  • 获取沙盒中Documents文件夹目录
    NSArray *documentsArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [documentsArr objectAtIndex:0];
    NSLog(@"%@", documentsPath);

  • 获取Library文件夹目录
NSArray *libraryArr = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *libraryPath = [libraryArr objectAtIndex:0];
    NSLog(@"%@", libraryPath);

  • 获取Caches文件夹目录
    NSArray *cachesArr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesPath = [cachesArr objectAtIndex:0];
    NSLog(@"%@", cachesPath);

  • 获取tmp文件夹目录
    NSString *tmpPath = NSTemporaryDirectory();
    NSLog(@"%@", tmpPath);

示例代码

https://github.com/99ios/13.1.1