• iOS 应用沙盒机制与文件操作


    部分转帖自:http://www.uml.org.cn/mobiledev/201209211.asp

    一、IOS沙盒机制

    概述:IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

    1.1、每个应用程序都有自己的存储空间

    1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容

    1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

    通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

     

    2、打开模拟器沙盒目录

    下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。

    文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。

    2.1 方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名

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

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

    输完单击Enter键,退出终端,

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

    现在能看到资源库文件夹了。

    打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。

     

     

    2.2 方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。

    username这里写你的用户名。

     

    3、目录结构

    应用沙盒包含多个目录:

    -应用程序包(application bundle):包含所有的资源文件和可执行文件,而且是只读目录

    -Library/Preferences/:存放所有的偏好设置(preference),iOS 的 Setting(设置)应用会在该目录中查找应用的设置信息。通过 NSUserDefaults,可以存取 Library/Preferences/下的设置。iTunes 会在同步设备时备份该目录。

    -tmp/:用于保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除,应用没有 运行时,系统也可能会清除该目录下的文件。iTunes 不会再同步设备时备份该文件目录,通过函数 NSTemporaryDirectory 可以得到应用沙盒下 tmp 目录的全路径。

    -Documents/:保存应用运行时生成的需要保留的数据。iTunes 同步设备时会备份该目录。当设备发生故障时,可以从 iTunes 恢复该目录下的文件。例如:游戏应用可将游戏存档保存再该目录下。

    -Library/Caches/:保存应用运行时生成的需要保留的数据。

    ------------------------------------------------------------------------------------------------------------------------

    二、IOS文件操作

    1. NSSearchPathForDirectoriesInDomains:通过C函数 NSSearchPathForDirectoriesInDomains 可以得到沙盒中的目录的全路径。该函数有三个参数,分别时目录类型,域掩码(domain mask)和一个布尔值(决定是否需要展开路径中的波浪字符“~”)。

    例如:要得到应用的 Documents 目录

    NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *ourDocumentPath = [documents objectAtIndex:0];

    NSSearchPathForDirectoriesInDomains 返回值时 NSArray 对象,因为源自 Mac OS X ,在Mac OS X 上可能会有多个目录和传入的参数匹配,在 iOS 上一个目录类型只会对应一个目录,所以这里直接获取数组的一个 NSString 对象。

    2. NSHomeDirectory:还可以通过 NSHomeDirectory 函数得到沙盒自己的路径。注意:系统不允许在沙盒的跟目录下创建文件和目录,但是可以在沙盒的已有的目录下创建新的目录或文件。

    可以目录包括:Documents,Library 和 tmp ,可以通过将目录名加在 NSHomeDirectory 函数返回的字符串后面,从而拼出目录的全路径。

    NSString *sandboxPath = NSHomeDirectory();
    //根据沙盒的全路径,得到其下子目录的全路径
    NSString *documentPath = [sandboxPath stringByAppendingPathComponent@"Documents"];

    与 NSHomeDirectory+ 目录相比, NSSearchPathForDirectoriesInDomains 更安全,因为新版本的系统可能会修改目录的目录名。也可避免拼写错误。

    3. pathInDocumentDirectory 函数:

    return pathInDocumentDirectory(@"possessions.data");

    该函数的参数是文件名,返回值是相应文件在 Documents 目录下的全路径。

    4. 获取document目录 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];

    5. 获取Cache目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];

    6. 获取Library目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *path = [paths objectAtIndex:0];

    7. 获取Tmp目录

    NSString *tmpDir = NSTemporaryDirectory();

    8. 写入文件

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    if (!docDir) {
       NSLog(@"Documents 目录未找到");        
    }
    NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];
    NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
    [array writeToFile:filePath atomically:YES];

    文件看到的内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <array>
        <string>内容</string>
        <string>content</string>
    </array>
    </plist>

    9. 读取文件

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
    NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
    NSLog(@"%@", array);

    打印结果:

    2012-06-17 14:14:46.249 IosSandbox[3918:f803] (
        "U5185U5bb9",
        content
    ) 
  • 相关阅读:
    编写规范
    Springboot自定义starter
    H5 新增标签
    vagrant virtualbox docker
    h5 sessionStorage localStorage
    mysql 出现You can't specify target table for update in FROM clause错误的解决方法
    linux下利用nohup后台运行jar文件包程序
    JVM内存分配 Xms128m Xmx512m XX:PermSize=128m XX:MaxPermSize=512m
    Spring Boot:内置tomcat启动和外部tomcat部署总结
    Mysql DELETE 不能使用别名? 是我不会用!
  • 原文地址:https://www.cnblogs.com/dayw/p/3269931.html
Copyright © 2020-2023  润新知