来感受下iOS app的沙盒
沙盒机制(sandBox)
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒,所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
- 每个应用程序都有自己的存储空间。
- 应用程序不能翻过自己的围墙去访问别的存储空间的内容。
- 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
如果要访问到其他 App 的范围,必须要获取管理员许可才行,比如地理位置,相册,通讯录,话筒等。这是苹果系统的哲学,苹果认为只有把各个 App 孤立起来才能营造良好的用户体验和安全性。
通过下面的图来看一下苹果的沙盒机制吧.
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
沙盒目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 Tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。
Library:苹果建议用来存放默认设置或其它状态信息。会被iTunes同步但是要除了Caches子目录外。
Library/Caches:主要是缓存文件,用户使用过程中缓存都可以保存在这 个目录中。这个目录就用于保存那些可再生的文件,可以重新下载或者重新生成的数据应该保存在目录下面。(比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹)。磁盘空间不够时 系统会删除 不会被iTunes同步。
Library/Preferences:应用程序的偏好设置文件。我们使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道plist中! 会被iTunes同步。
tmp:各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,也可能随着项目退出删掉。不会被iTunes同步。
iPhone在重启时,会丢弃所有的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);
存数据到沙盒plist文件中。
+(void)writeDataToPlist :(NSMutableArray *)dataArray
{
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path=[paths objectAtIndex:0];
NSLog(@"path:%@",path);
NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
//写入
NSFileManager* fm = [NSFileManager defaultManager];
[fm createFileAtPath:filename contents:nil attributes:nil];
[dataArray writeToFile:filename atomically:YES];
}
沙盒plist文件读取
+(NSArray *)getDataFormPlist{
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path=[paths objectAtIndex:0];
NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
//读文件
NSArray* dataArray = [NSArray arrayWithContentsOfFile:filename];
return dataArray;
}
可以查看沙盒的应用
文件常见操作
判断某文件是否存在
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){
//下面是对该文件进行制定路径的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
}
保存某个文件
可以用 NSFileManager的
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;
删除文件
NSFileManager* fm=[NSFileManager defaultManager];
NSError *myError = nil;
if ([fm removeItemAtPath:@"" error:&myError] == YES){
}
移动文件
NSFileManager* fm=[NSFileManager defaultManager];
NSError *myError = nil;
if ([fm moveItemAtPath:@"" toPath:@"" error:&myError] == YES){
}
拷贝文件
NSFileManager* fm=[NSFileManager defaultManager];
NSError *myError = nil;
if ([fm copyItemAtPath:@"" toPath:@"" error:&myError] == YES){
}
取得一个目录下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
读取某个文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
保存汉字
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile.txt"];
NSString *content=@"更深夜静人已息";
NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];
if ([contentData writeToFile:fileName atomically:YES]) {
NSLog(@">>write ok.");
}
使用工程中的文件
NSString *myFilePath = [[NSBundle mainBundle] pathForResource:@"f" ofType:@"txt"];
NSString *myFileContent=[NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"bundel file path: %@ \nfile content:%@",myFilePath,myFileContent);
小结
后续如果有新的相关知识get,会持续更新。