您的位置:首页 > 移动开发 > IOS开发

iOS 沙盒目录中各个目录的作用

2016-12-13 16:46 155 查看
首先关于沙盒机制的介绍:

iOS 沙河机制

另外关于iOS的数据储存方式的介绍:

iOS 数据持久化方法

前言:

处于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如在用户授权情况下访问通讯录,相册等),这个规则展示了iOS系统的封闭性。在开发中常常需要数据存储的功能,比如存取文件,归档解档等。

一、沙盒的目录结构及各个目录的作用

每个APP的沙盒下面都有相似目录结构,如图(苹果官方文档):





NSString *path = NSHomeDirectory();


上面的代码得到的是应用程序目录的路径,在该目录下有三个文件夹:Documents、Library、temp以及一个.app包!该目录下就是应用程序的沙盒,应用程序只能访问该目录下的文件夹!!!

AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。

只有用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在/Documents目录下面,并将通过iCloud自动备份。

一般用来存放应用中建立的文件, 如数据库文件, 或者程序中浏览的数据, 如果进行备份将会备份此文件夹内容

Library 目录:这个目录下有两个子目录:

Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.

Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。可以重新下载或者重新生成的数据应该保存在/Library /caches目录下面。举个例子,比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹。

可创建子文件夹,用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。

tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。尽管iCloud不会备份这些文件,但在应用使用完这些数据之后要注意随时删除,避免占用用户设备的空间。

二、获取各种文件目录的路径

获取目录路径的方法:

// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();

// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

// 获取tmp目录路径
NSString *tmpDir =  NSTemporaryDirectory();


获取应用程序程序包中资源文件路径的方法:

// 资源包路径
NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
// 资源包中某资源的路径
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
// 从资源的路径中获取资源
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];


三、NSSearchPathForDirectoriesInDomains方法

NSSearchPathForDirectoriesInDomains方法用于查找目录,返回指定范围内的指定名称的目录的路径集合。有三个参数:

directory :

NSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称。

比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。

如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。

domainMask:

NSSearchPathDomainMask类型的enum值,指定搜索范围。

这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。

还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。

expandTilde :

BOOL值,表示是否展开波浪线~。

我们知道在iOS中~的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。

该值为NO:Caches目录路径~/Library/Caches

该值为YES:Caches目录路径

/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches

文/小木___Boy(简书作者)

原文链接:http://www.jianshu.com/p/dd3f120eb249

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

注意:

**一定要把要存的文件存到正确的位置,不然在审核的时候有可能因为违反苹果的规则而被拒!**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  沙盒 ios