iOS应用沙盒

来源:互联网 发布:mac声音键 下面 禁止键 编辑:程序博客网 时间:2024/05/09 03:50

一. 应用沙盒

沙盒也叫沙箱,英文sandbox。iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),它是应用程序的存储空间,所有的非代码文件都保存在这个地方,应用只能读写自己文件系统目录里的文件,不能直接访问其他应用的文件系统目录。应用程序向外请求或接收数据都要通过权限检测,假如不符合条件的话,不会被放行。沙盒机制导致了应用程序之间的通讯障碍,但iOS8之后新开放了一种对几个固定系统区域的扩展机制Extension,它在一定程度上弥补了沙盒机制对应用间通信的限制。
Extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today的widgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验;但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量。

(一). 应该沙盒的结构

  1. Documents(文档数据)
    保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录

  2. Library(资源库)
    Library下默认有两个文件夹,Caches文件夹和tmp文件夹

    a. Caches(缓存)
    保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。该文件夹一般用于存储体积大、不需要备份的非重要数据

    b. Preferences(偏好设置)
    保存应用的所有偏好设置,iOS的Settings(设置),应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录

  3. tmp(临时文件目录)
    保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。iPhone在重启时,会丢弃所有的tmp文件

(二). iTunes同步设备

关于iTunes的同步设备,有一条规律,体积大的文件夹iTunes不会备份,如:Caches和tmp文件夹;体积小的文件夹iTunes会备份,如:Documents和Preferences文件夹

(三). 打开应用沙盒

1.方法一
应用沙盒是在MAC的资源库(Library)目录下,资源库文件夹默认是隐藏的,要显示隐藏的资源库才能查看iPhone模拟器的应用沙盒

(1). 显示隐藏文件,需要在Mac终端输入下面的命令

显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES

隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO

输完以上命令,并按回车Enter键,退出终端,重新启动Finder就可以了

重启Finder:鼠标单击窗口左上角的苹果标志–>强制退出–>Finder–>重新启动

(2). 沙盒的路径
/Users/sjm/Library/Developer/CoreSimulator/Devices/B713CC38-F99C-4345-83B0-2AF9B61F661D/data/Containers/Data/Application/CE0A877D-DB8F-43C7-BFBB-97333406BFA3
注意:
这里使用的是MAC X 10.11.5,Xcode版本是Xcode7.2.1,不同的OS系统版本或Xcode版本路径名可能稍微有点差异,但是大体思路相同
sjm:Mac用户名
B713CC38-F99C-4345-83B0-2AF9B61F661D:iPhone6S的模拟器
CE0A877D-DB8F-43C7-BFBB-97333406BFA3:自己写的应用程序的沙盒目录

2.方法二
安装SimPholders应用程序,该应用可以轻松查看每一个应用程序的应用沙盒

(四). 使用沙盒机制的好处

  1. 安全:别的App无法修改你的程序或数据

  2. 保护隐私:别的App无法读取你的程序和数据

  3. 方便删除:因为一个App所有产生的内容都在自己的沙盒中,所以删除App只需要将沙盒删除就可以彻底删除程序

二. 获取路径

1. 沙盒路径

(1). NSHomeDirectory函数获取

    NSString *homePath = NSHomeDirectory();    NSLog(@"%@",homePath);

(2). NSHomeDirectoryForUser函数获取

    NSString *userName = NSUserName();    NSString *homePath = NSHomeDirectoryForUser(userName);    NSLog(@"%@",homePath);

2. Documents路径

(1). 用沙盒根目录拼接

    NSString *homePath = NSHomeDirectory();    // 不建议采用,因为新版本的操作系统可能会修改目录名    NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];    NSLog(@"%@",documentsPath); 

(2). NSSearchPathForDirectoriesInDomains函数获取

    // NSDocumentDirectory:用户的主目录     // NSUserDomainMask:代表从用户文件夹下找    // YES:代表展开路径中的波浪字符“~”     // 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素,用firstObject取第一个元素    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;    NSLog(@"%@",documentsPath);

3. Tmp路径

(1). NSTemporaryDirectory函数获取

    NSString *tmpPath = NSTemporaryDirectory();    NSLog(@"%@",tmpPath); 

(2). 用沙盒根目录拼接

    NSString *homePath = NSHomeDirectory();    // 不建议采用,因为新版本的操作系统可能会修改目录名    NSString *tmpPath = [homePath stringByAppendingPathComponent:@"tmp"];    NSLog(@"%@",tmpPath);

4. Library/Caches路径

(1). 用沙盒根目录拼接

(2). NSSearchPathForDirectoriesInDomains函数获取

    NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;    NSLog(@"%@",cachesPath);

5. Library/Preference路径

(1). 用沙盒根目录拼接

(2). 偏好设置文件不需要获取全路径,通过NSUserDefaults类可以读写Preference目录下的偏好设置文件

0 0
原创粉丝点击