目录

iOS 沙盒与 Bundle

iOS 沙盒机制

沙盒是系统为每一个应用程序生成的一个特定文件夹 ,文件夹的名字由十六进制数据组成,每一个应用程序的沙盒文件名都是不一样的,是由系统随机生成的。在iOS中,为了安全性,这个文件夹别的 app 是不可以访问的。理论上 app 只能在自己的沙盒里存取文件,除了一些系比较特殊的数据储存方式,如 keychain ,iCloud, iOS11 新增的 file 等等。

沙盒下一共有三个目录:

  1. Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下,这个目录用于存储用户数据或其它应该定期备份的信息。
  2. Library 目录:这个目录下有两个子目录:Caches 和 Preferences。
    • Caches目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息,存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出后删除。
    • Preferences 目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。
  3. tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除。

注意:iTunes在与iPhone同步时,备份所有的Documents和Library文件。iPhone在重启时,会丢弃所有的tmp文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 沙盒主目录
NSString *homeDir = NSHomeDirectory();
NSLog(@"%@", homeDir);

// Documents 路径
NSString *docDir1 = [homeDir stringByAppendingPathComponent:@"Documents"];
NSLog(@"%@", docDir1);

/**
参数
1. NSDocumentDirectory 搜索路径的类型
2. NSUserDomainMask    在iOS上固定的
3. 是否展开波浪号        YES
*/
NSString *docDir2 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@", docDir2);

// Caches路径 
NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"%@", cacheDir);

// tmp路径
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"%@", tmpDir);

//  Preferences偏好设置目录,保存手机常用设置信息,用户的个人信息,例如用户名,密码
// 直接使用setXXX方法赋值即可,无需获得路径
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"hehe" forKey:@"UserName"];
[defaults setBool:YES forKey:@"AutoLogin"];

// 默认情况下,往偏好设置保存数据,更新的非常慢,如果需要及时保存,需要使用一个同步方法
[defaults synchronize];

Bundle

Bundle 是一个资源文件包。我们将许多图片、文本文件、mp3等组织在一起,打包成一个 Bundle 文件。方便在其他项目中引用包内的资源。

Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的二进制数据。

mainBundle 对应于应用程序文件归档或者应用程序的封包:一个以“.app”为扩展名并以应用程序名称为基本名的目录。

1
2
3
// mainBundle
NSString *bundlePath = [NSBundle mainBundle].bundlePath;
NSLog(@"%@", bundlePath);