0%

iOS 沙盒路径分析

一个 App 与文件系统的交互完全限制在 app's sandbox directory 中,具体目录结构如下。注意沙盒并不是 Data Container 而是包括 Bundle Container 等一系列目录,这些目录将一个 App 限制在一定的范围内。

图 1 - 沙盒目录

常用目录解释

Bundle Container

Bundle Container 下就是 App 本身。

APPName.app

模拟器下的目录:

1
/Users/qiweipeng/Library/Developer/CoreSimulator/Devices/1679AE2F-140F-400A-B21E-DF9A94CE842E/data/Containers/Bundle/Application/76D971A9-3397-4814-A043-80EA68438B78/Demo.app

其中,Demo.app 上一级目录,即 76D971A9-3397-4814-A043-80EA68438B78 每次 App 运行都会改变(具体可以观察那个文件夹,每次 command + R 的时候,那个文件夹名就会变一下),这是为了安全考虑。

这个目录包含应用和它的所有资源,只可以读取,无法修改和写入。不会被备份

Data Container

图 2 - 模拟器下的 Data Container

这些目录中:

  • Documents 文件夹和 Library 文件夹(但是除了 Caches 文件夹)会被 iTunes 或者 iCloud 备份;
  • tmp 文件夹中的数据当程序关闭就会被清除;
  • Caches 文件夹当手机空间不足时候很可能就会被清空;

Documents

这个目录存储用户生成的内容,应该并且只应该把希望暴露给用户的文件放在这里,如软件的备份文件,用户可以访问并可以转存。或者如 Mindnode 中的每个思维导图的文件,这是用户生成的也是用户希望可以自己看到并掌控的文件。

这个目录会被 iTunes 或者 iCloud 备份,因此不会丢失。

Library

这个目录放的应该是非用户的数据,用户不需要看到。这个目录中除了 Caches 目录的其他目录会被 iTunes 或者 iCloud 备份。

Preference:

  • 这里面应该存放应用的偏好设置,比如某个按钮的开关状态,这是不会被删除且会被备份的;

Caches:

  • 这里存放缓存数据,比如网络加载的图片等;
  • 缓存数据在 iOS 5.0 以后,只有当手机空间不足的时候,系统才会主动去清理,并且当应用运行的时候一定不会清理;

tmp

这了的文件是应用运行过程中的临时文件,当应用程序不再运行的时候系统就会删除这里的文件。这个目录不会被备份。

路径的获取方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1. 获取 App 包路径
NSString *boundlePath = [NSBundle mainBundle].bundlePath;
NSLog(@"包路径:%@", boundlePath);

// 2. 获取 Data Container 根路径
NSString *homePath = NSHomeDirectory(); // 由名字可见,这个目录可以理解为本 app 的用户的家目录
NSLog(@"Data Container 路径:%@", homePath);

// 3. 获取 Documents 路径
// NSSearchPathDirectory 要找的什么文件
// NSSearchPathDomainMask 搜索域,这里是用户域下
// expandTilde 是否展开路径,如果填 NO 的话前面就会显示 ~
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Documents 路径:%@", documentsPath);

// 4.获取 Library/Caches 路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Library/Caches 路径:%@", cachesPath);

// 5.获取 tmp 路径
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"tmp 路径:%@", tmpPath);