> IOS开发在线手册 > iOS开发-沙盒(sandbox)机制

苹果前天发的财报,貌似现在用ios系统的比以前又多了一些,但是大家的iPhone购买的渠道也是五花八门,有的从非正规渠道购买的iPhone里的操作系统已经被越狱过,越狱这个事情和Android的root刷机是是一样的,正常情况下大家用手机都是没问题的。不过有些人总是觉得iOS和Android各种用的不爽,需要管理员权限,不过凡事有利有弊,以前有人买苹果刷机是因为输入法。现在输入法问题解决了,还是有人越狱,花几千大洋买个iPhone然后越狱,这种事情想想都很。。

 Android系统中应用程序安装后,系统会为其分配一个独立的存储空间(Security Sandbox),存放字节码文件、资源文件及配置文件,同时为应用程序分配唯一的ID,标识应用程序的相关文件和资源,系统通过设置权限从而实现一个应用程序在一般情况下只能访问该应用程序的文件和资源。iOS操作系统差不多类似,iOS是从苹果的next操作系统发展过来的,next是一款类unix操作系统,unix系统对于文件权限的限制非常严格,正常情况下普通用户常用的操作根本用不到root权限,用户的操作请求假如是已分配权限,自然可以执行,反之需要root权限的话就不被允许。对于应用程序而言也是同样的,分配一个空间,然后只有允许的权限才能访问内容。

下面是张苹果官网以前关于沙盒方面的图片:

iOS开发-沙盒(sandbox)机制

 

上面这个图就是常说的每个应用程序都有自己的存储空间,应用程序不能翻过自己的围墙去访问别的存储空间的内容,应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。其实简单理解每个应用都是其独立的分配空间,比如说如果360可以访问QQ聊天的内容,那么估计Pony就破产了~

sandbox的启用流程:①sandbox_init 通过libsandbox.dylib转换为二进制传递给kernel mac syscall TrustedBSD ②将sandbox_init 的请求发sandbox.kext 的扩展(看到这里会想到IIS扩展),扩展为当前进程安装证书,然后返回安装结果.③如果安装成功,每次进程的请求,都会被trusted bsd 发送给sandbox.kext 去匹配之前安装的证书规则。如果证书不匹配的话,则安装失败。
为了看下xCode模拟器中启动的Demo路径和类型,可以进行接下来的操作,在viewDidLoad加一句话:
    NSLog(@"路径:%@",NSHomeDirectory());

这个时候会看到一个路径,测试生成结果:

路径:/Users/用户名/Library/Developer/CoreSimulator/Devices/C53A5D69-DEDD-4598-9297-79B811E14DAD/data/Containers/Data/Application/0FCDA696-03B4-4D8D-B99B-E94D1F843561

 打开Finder是没法找到这个路径的,需要在终端中输入命令显示隐藏文件:

终端中显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true

终端中不显示隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false

模拟器的信息在CoreSimulator中:

iOS开发-沙盒(sandbox)机制

路径比较长,之后是模拟器型号,模拟器的具体信息:

iOS开发-沙盒(sandbox)机制

之后在Data中可以看到具体应用信息,和一个应用包括的目录信息:

iOS开发-沙盒(sandbox)机制

Documents目录存储的是程序中创建的或在程序中浏览到的文件数据,Library存储程序的默认设置或其它 状态信息;Library下的Caches目录存放缓存文件,Library下的Preferences目录存放的应用程序的偏好设置,tmp保存的是创建和存放的临时文件,以上路径也可以通过程序获取路径viewDidLoad中加入以下代码:

   //获取Documents文件夹目录,NSDocumentDirectory获取Doucments文件夹目录,NSUserDOMainMask是在当前应用沙盒中获取,所有应用沙盒目录组成一个数组结构的数据存放
    NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSLog(@"Documents目录:%@",[documentPath objectAtIndex:0]);
    
    //缓存Cache目录
    NSArray *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSLog(@"缓存目录:%@",[cachePath objectAtIndex:0]);
    
    //Library目录
    NSArray *domainPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSLog(@"资源库目录:%@",[domainPath objectAtIndex:0]);
    
    //临时文件temp目录
    NSLog(@"临时文件目录:%@",NSTemporaryDirectory());