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] (
    "\U5185\U5bb9",
    content
) 

 

 

posted @ 2013-08-20 12:24  Dayw  阅读(617)  评论(0编辑  收藏  举报