iOS沙盒机制

iOS沙盒机制

沙盒机制

不好意思,我又一次来到了你们的世界,其实我是拒绝的,但是我的无法忍受内心的躁动!额我TMD的在说什么胡话,bug改的脑子都坏了吧.回到正题今天要给大家分享的是iOS的沙盒机制.

先来看一张苹果官方文档的图吧.


官方文档

1. 我们从这张图可以看到,我们的每个应用都分为Bundle Container和Data Container和iCloud Container三个文件,今天我们主要研究的是Data Container.可以看到三个目录我们是否感觉非常熟悉,一个是Documents,一个是Library,一个是Temp文件. 2. 先不介绍这三个文件了,先学习一下沙盒机制吧.iOS应用程序只能在改程序所创建的文件系统中读取文件,不可以去访问其他应用的文件.此区域就成为沙盒.可以理解为一个密不透风的盒子,你只能在这个盒子当中读取文件和存入文件,不能存到隔壁老王家的沙盒中.这些文件可以保存非代码的文件,比如:图像,图标,声音,映像,属性列表,文本文件等. 3. 每个应用程序都有自己的存储空间,每个应用程序不能翻过自己的围墙去访问别的存储空间的内容,应用请求的数据都要通过权限检测,假如没有通过,就不能请求该文件的数据.

通过下面的图来看一下苹果的沙盒机制吧.


沙盒机制

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

沙盒目录

刚才我们已经看过了沙盒的目录了,包含document,library,Temp三个文件,这三个文件一般是不可见的,有两种方式可以查找文件的具体目录:

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--> 现在能看到资源库文件夹了。

1.2 这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。userName使用你的用户名

如果你看了和我这张效果图一样的文件目录层级,证明你已经找到了沙盒文件的目录.


沙盒目录

沙盒文件各自的作用

documents:苹果建议将程序中建立的活在程序中浏览到的文件数据保存在该目录下,还有ituns备份的资料也放在该文件下.

library:存储程序的默认设置和其他信息.

library/Caches:存放缓存的文件,可以存储一些缓存数据.

library/Preferences:存放一些偏好设置等文件.

tmp:提供一个临时创建文件的地方,在退出程序后删除.

沙盒文件的操作

获取程序的home目录

NSString *homeDirectory = NSHomeDirectory();

NSLog(@"path:%@", homeDirectory);

获取document目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *path = [paths objectAtIndex:0];

NSLog(@"path:%@", path);

获取Cache目录 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *path = [paths objectAtIndex:0];

NSLog(@"%@", path);

获取Library目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

NSString *path = [paths objectAtIndex:0];

NSLog(@"%@", path);

获取Tmp目录

NSString *tmpDir = NSTemporaryDirectory();

NSLog(@"%@", tmpDir);

写入文件

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];

读取文件

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);

使用NSFileManager进行文件操作

在我这次做epub3于都器的时候遇到一个问题,就是使用af3.1.0后,af会将文件直接保存到document文件下,但是我想早document目录下的用户目录下的用户名目录下的bookId目录下保存文件,但是不知道到底怎么在document下创建子文件夹,最后通过查找资料和查看苹果官方文档最终完成了下载到指定文件目录下.temp也类似,自己可以下去自己研究在这不做解释.

保存文件到指定文件

NSString* filePath = [LQEpubFileManager getFilePathWithUserId:userId fileName:bookId];

NSFileManager *fileManager = [NSFileManager defaultManager];

NSError* error;

BOOL isSuccess = [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error];

NSString *path;

if (isSuccess == YES) {

     path = [filePath stringByAppendingPathComponent:response.suggestedFilename];

}

return [NSURL fileURLWithPath:path];

获取目录列所有文件名

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSLog(@"documentsDirectory%@",documentsDirectory);

NSFileManager *fileManage = [NSFileManager defaultManager];

NSString *myDirectory = [[documentsDirectory stringByAppendingPathComponent:@"weiqi"]stringByAppendingPathComponent:@"12306"];

NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil]; NSLog(@"%@",file);

NSArray *files = [fileManage subpathsAtPath: myDirectory ];

NSLog(@"%@",files);

删除文件

[fileManager removeItemAtPath:fileName error:nil];

总结

沙盒机制保证了我们每一个应用程序的安全性,只能访问自己沙盒文件下的文件.NSFileManager帮助哦我们很好的管理沙盒文件下的文件.对文件进行操作使用NSFileManager操作沙盒文件十分简单.今天就总结到这里.

本人联系方式:qq:513961360

email:513961360@qq.com

也可以加我们的qq群希望能与朋友们一起聊天和学习.群里还有很多iOS开发者,帮助我们解决问题,并且同时学习.

qq群号:580284575

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容