iOS 应用沙盒

作者: iOS_成才录 | 来源:发表于2015-11-12 19:27 被阅读1797次

    一、简介

    • 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
      • 应用必须待在自己的沙盒里,其他应用不能访问该沙盒

    二、应用沙盒目录

    • Application应用程序包:包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改

    • Documents:保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图

      • 注意点:不要保存从网络上下载的文件,否则会无法上架!
    • Library

      • Caches:存放体积大又不需要备份的数据
        • 保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
        • 系统不会清理 cache 目录中的文件
        • 就要求程序开发时,"必须提供 cache 目录的清理解决方案"
      • Preference:保存应用的所有偏好设置,iCloud会备份设置信息
        • 用户偏好,使用 NSUserDefault 直接读写!
        • 如果要想数据及时写入磁盘,还需要调用一个同步方法
    • tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能

      • 保存临时文件,"后续不需要使用"
      • tmp 目录中的文件,系统会自动清理
      • 重新启动手机,tmp 目录会被清空
      • 系统磁盘空间不足时,系统也会自动清理

    三、应用沙盒目录的常见获取方式

    **1、沙盒根目录 **

     NSString*home = NSHomeDirectory();
    

    2、Documents目录 2种方式

    • 1.利用沙盒根目录拼接”Documents”字符串
      • 注意:不建议采用,因为新版本的操作系统可能会修改目录名
    NSString*home = NSHomeDirectory();
    NSString*documents =[home stringByAppendingPathComponent:@"Documents"];
    
    • 2.利用NSSearchPathForDirectoriesInDomains函数
    // NSUserDomainMask 代表从用户文件夹下找
    // YES 代表展开路径中的波浪字符“~”
    NSArray*array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
    // 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
    NSString*documents =[array objectAtIndex:0];
    

    3、tmp临时目录

    NSString *tmp = NSTemporaryDirectory();
    

    4、Library/Caches 目录

    • 方式一:利用沙盒根目录拼接”Caches”字符串

    • 方式二:利用NSSearchPathForDirectoriesInDomains函数(将函数的第2个参数改为:NSCachesDirectory即可)

    NSString*documents =[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, NO) objectAtIndex:0]];

    
    > **5、Library/Preference 偏好设置**
    
    + 通过NSUserDefaults类存取该目录下的设置信息
    
    # 四、分类抽取,快速方法沙盒中的文件夹
    + 1、 NSString分类抽取
    
    ```objc
    
    // 1、.h文件
    
    #import <Foundation/Foundation.h>
    
    @interface NSString (JP)
    
    // 用于生成文件在caches目录中的路径
    - (instancetype)cacheDir;
    // 用于生成文件在document目录中的路径
    - (instancetype)docDir;
    // 用于生成文件在tmp目录中的路径
    - (instancetype)tmpDir;
    
    @end
    
    // 2. .m实现文件
    
    #import "NSString+JP.h"
    
    @implementation NSString (JP)
    
    - (instancetype)cacheDir
    {
     // 1.获取caches目录
     NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
     // 2.生成绝对路径
     return [path stringByAppendingPathComponent:[self lastPathComponent]];
    }
    
    - (instancetype)docDir
    {
     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     return [path stringByAppendingPathComponent:[self lastPathComponent]];
    }
    
    - (instancetype)tmpDir
    {
     NSString *path = NSTemporaryDirectory();
     return [path stringByAppendingPathComponent:[self lastPathComponent]];
    }
    @end
    
    
    • 2、使用抽取分类:如:获取caches文件夹下的abc.png图片
    NSString *filePath = [@"abc.png" cacheDir];
    

    相关文章

      网友评论

      • 木子红啊:误人子弟了哥们,好好看看官方文档,英语不好别乱翻译,同时也自己多实践别拿来主义。好好看看caches目录的介绍:
        Put data cache files in the Library/Caches/ directory. Cache data can be used for any data that needs to persist longer than temporary data, but not as long as a support file. Generally speaking, the application does not require cache data to operate properly, but it can use cache data to improve performance. Examples of cache data include (but are not limited to) database cache files and transient, downloadable content. Note that the system may delete the Caches/ directory to free up disk space, so your app must be able to re-create or download these files as needed.

      本文标题:iOS 应用沙盒

      本文链接:https://www.haomeiwen.com/subject/klwxhttx.html