iOS沙盒目录结构解析

来源:互联网 发布:ins是什么软件下载 编辑:程序博客网 时间:2024/05/15 05:48

目录(?)[+]

iOS沙盒目录结构解析
作者:wangzz
原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713
转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢!

出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能在用户授权的情况下被第三方应用访问),这个规则把iOS系统的封闭性展现的淋漓尽致。

一、沙盒中几个主要的目录

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

每个应用的沙盒目录都是相似的,主要包含图中所示的4个目录:

1、MyApp.app

①存放内容
该目录包含了应用程序本身的数据,包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录中动态加载代码或资源到内存,这里用到了lazy loading的思想
②整个目录是只读的
为了防止被篡改,应用在安装的时候会将该目录签名。非越狱情况下,该目录中内容是无法更改的;在越狱设备上如果更改了目录内容,对应的签名就会被改变,这种情况下苹果官网描述的后果是应用程序将无法启动,我没实践过。
③是否会被iTunes同步

2、Documents

①存放内容
我们可以将应用程序的数据文件保存在该目录下。不过这些数据类型仅限于不可再生的数据,可再生的数据文件应该存放在Library/Cache目录下。
②是否会被iTunes同步

3、Documents/Inbox

①存放内容
该目录用来保存由外部应用请求当前应用程序打开的文件。
比如我们的应用叫A,向系统注册了几种可打开的文件格式,B应用有一个A支持的格式的文件F,并且申请调用A打开F。由于F当前是在B应用的沙盒中,我们知道,沙盒机制是不允许A访问B沙盒中的文件,因此苹果的解决方案是讲F拷贝一份到A应用的Documents/Inbox目录下,再让A打开F。
②是否会被iTunes同步

4、Library

①存放内容
苹果建议用来存放默认设置或其它状态信息。
②是否会被iTunes同步
是,但是要除了Caches子目录外

5、Library/Caches

①存放内容
主要是缓存文件,用户使用过程中缓存都可以保存在这个目录中。前面说过,Documents目录用于保存不可再生的文件,那么这个目录就用于保存那些可再生的文件,比如网络请求的数据。鉴于此,应用程序通常还需要负责删除这些文件。
②是否会被iTunes同步
否。

6、Library/Preferences

①存放内容
应用程序的偏好设置文件。我们使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道plist中!
②是否会被iTunes同步

7、tmp

①存放内容
各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,目前已知的一种可能清理的原因是系统磁盘存储空间不足的时候。
②是否会被iTunes同步

二、获取主要目录路径的方式

1、沙盒目录

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. NSLog(@"%@",NSHomeDirectory());  
输出结果:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A  

2、tmp

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. NSLog(@"%@",NSTemporaryDirectory());  
输出结果:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /private/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/tmp/  

3、Myapp.app

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);  
输出结果:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/PhoneCall.app  

4、Documents

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2. NSString *path = [paths objectAtIndex:0];  
  3. NSLog(@"%@",path);  
输出结果:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/Documents  
这里用到的NSSearchPathForDirectoriesInDomains方法需要解释下,其声明如下:
[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. FOUNDATION_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);  
该方法用于返回指定范围内的指定名称的目录的路径集合。有三个参数:
  • directory
NSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。
  • domainMask
NSSearchPathDomainMask类型的enum值,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
  • expandTilde
BOOL值,表示是否展开波浪线~。我们知道在iOS中~的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。

三、参考文档

1、苹果官方文档

https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010672-CH1-SW1

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米3s忘记密码怎么办 小米3卡槽卡住了怎么办 红米4手机信号不好怎么办 红米note3信号差怎么办 红米note3没信号怎么办 红米3运行慢怎么办 红米手机运行慢怎么办 红米手机忘记解锁图案怎么办 小米手机解锁图案忘了怎么办 红米2内屏坏了怎么办 红米密码忘记了怎么办 红米pro玩王者卡怎么办 红米note4不支持计步怎么办 红米pro玩游戏卡怎么办 红米手机费电快怎么办 荣耀5c忘记密码怎么办 小米之家不退货怎么办 手机号绑定过多小米账户怎么办 耐克黑色鞋褪色怎么办 买广汽传祺7s新车有问题怎么办 华为荣耀10边框掉色了怎么办 网购商家打来无货怎么办 客户拍了不发货怎么办 天猫商家欺骗买家怎么办 阿里买家投诉我发空包怎么办 苹果6s电池坏了怎么办 hm买的单鞋脏了怎么办 微店违规屏蔽搜索怎么办 ios微信支付失效怎么办 京东第三方店铺关闭怎么办 京东店铺关门了怎么办 国美退款不到账怎么办 小米小店通过了怎么办 苹果的发票丢了怎么办 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办