1、沙盒机制介绍
iOS中沙盒机制是一种安全体系,对应着某片独立的存储空间。任意一个iOS移动端程序项目工程都有各自独立的文件系统(独立的存储空间),项目工程应用程序的各种操作效果数据的来源都只能在对应的独立的文件系统存储空间内进行(沙盒空间)。
应用程序项目工程的任何操作必然是在自己的沙盒对应的独立存储空间里进行操作,应用程序项目工程和独立的沙盒空间是彼此一一对应的。A应用程序不能访问B项目的沙盒。所有的非代码规则文件都要保存在对立的沙盒内存空间中(某片特殊特性的内存区域),例如属性文件plist、文本文件text、图像、图标、媒体资源等。沙盒这片特殊特性的内存区域是用来充当缓冲区的。当APP进入关闭模式,充当缓冲区的沙盒空间自动清理释放掉内容,还原设备空间,促使设备空间高效使用。
//调用C函数实例获取当前项目工程应用程序对应的独立沙盒空间的存储路径
NSLog(@“HomeDirectory=%@”,NSHomeDirectory());
HomeDirectory=/Users/haijunyan/Library/Developer/CoreSimulator/Devices/C43C9AE4-08DE-40AA-BA3F-F134F5C3BE93/data/Containers/Data/Application/5A22CCB5-ABD7-4E6E-BE54-E274DE11F695
/Users/haijunyan/Library/Developer此时映射内存条部分
2、缓内存区沙盒空间呈现出的目录层次结构
(1)/AppName.app 应用程序的程序包目录层次,包含了应用程序的本身体系。由于任意的应用程序必须经过签名,所以不能在运行时对程序包目录中的内容进行修改(破坏了约定规则),否则修改程序包破坏了约定规则会导致应用程序无法启动。
(2)/Documents/保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如用户从远程网络上服务器硬件设备处下载的图片数据或音乐文件数据等基本上都放置到本地端电脑硬盘的某片存储区域(路径表现为/Documents/文档路径文件夹))。在苹果本身的监控机制下,/Documents/文档路径文件夹处于苹果的监控自更新机制体系下,当苹果服务器内有关于应用程序的配置数据发生更新时通过监控机制获取到监控的更新信息通知时将会自动备份实现远程数据自动传送至本地电脑端的硬盘文档区域,类似的在连接iTunes时也会自动同步备份文档中的数据。
(3)/Library目录:这个目录下有两个子目录:
可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。
/Library/Caches(缓存)缓存文件夹:保存应用程序使用时临时产生的支持文件和缓存文件(存储着应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes同步时不会备份/Library/Caches(缓存)缓存文件夹目录并且可能被其他清理工具清理掉其中的数据。
/Library/Preferences(偏好)保存项目工程应用程序的偏好设置文件(用 NSUserDefaults类访问调用standardUserDefaults类成员方法获取NSUserDefaults类风格实例对象值,在该风格的实例对象值下通过setObjectforkey对象风格成员方法把渲染所需要的相关数据内容信息写入内存区域,然后再通过syncro同步方法将内存中新状态下的内存数据信息同步自动更新至/Library/Preferences(偏好)文件夹路径下的硬盘区域自动创建存储;连接iTunes时/Library/Preferences(偏好)文件夹路径下的硬盘区域中的自创建偏好设置文件可备份至iTunes的远程服务器硬件设备端,在项目工程应用程序出现更新时/Library/Preferences(偏好)文件夹路径下的硬盘区域中的自创建偏好设置文件会同步更新自动备份;plist文件就放在此处)。
(4)/tmp/:MacintoshHD硬盘的最外层存在名为/tmp/隐式文件夹(保存项目工程应用程序正式运行时所需要的某些临时数据,当项目工程应用程序正式运行时某些运行需要的配置型数据临时暂存在/tmp/隐式文件夹路径下面,在应用app退出时或iphone设备重启时该目录下所有的临时性文件将自动销毁) ,该目录路径下的临时性文件不会被iTunes自动备份。例如录制视频完成后默认构建的视频数据文件是放在/temp/文件夹下的临时性文件,退出应用程序后就会进行自动销毁;所以录制视频结束后应该将所录视频对应的视频数据文件通过nsfilemanager辅助对象实现从tmp文件夹下转移到相册文件夹中。
iTunes在与iPhone设备同步时,备份所有的Documents和Library文件。
备注:苹果公司涉及到的沙盒描述https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html
沙盒目录结构如图所示
任意应用程序操作时都通过某片独立的存储空间进行数据的处理,好似数据孤岛沙盒。
// 获取沙盒根目录路径
NSString*homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString*docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
//获取Library的目录路径
NSString*libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];
// 获取cache目录路径
NSString*cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];
// 获取tmp目录路径
NSString*tmpDir =NSTemporaryDirectory();
// 获取应用程序程序包中资源文件路径的方法:
NSLog(@"%@",[[NSBundlemainBundle] bundlePath]);
NSStringimagePath = [[NSBundlemainBundle] pathForResource:@"apple"ofType:@“png”];
UIImageappleImage = [[UIImagealloc] initWithContentsOfFile:imagePath];
3.NSSearchPathForDirectoriesInDomains
NSSearchPathForDirectoriesInDomains方法用于查找目录,返回指定范围内的指定名称的目录的路径集合。有三个参数
(1)directoryNSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录
(2)domainMaskNSSearchPathDomainMask类型的enum值,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等
(3)expandTildeBOOL值,表示是否展开波浪线。我们知道在iOS中的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”