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 )