IOS 沙盒机制 浅析

Posted 吴雨欣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS 沙盒机制 浅析相关的知识,希望对你有一定的参考价值。

ios中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。

1.每个应用程序都在自己的沙盒内(提示:在IOS8中已经开放访问)

2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容

3.应用程序向外请求或接收数据都需要经过权限认证

技术分享
//获取home目录
    NSString *homePath = NSHomeDirectory();
    NSLog(@"home%@",homePath);
   
    //获取documents目录
    //方式1:
    NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [documents lastObject];
    NSLog(@"%@",documentsPath);
    //方式2:拼接字符串
    NSString *documentPath2 = [homePath stringByAppendingPathComponent:@"Documents"];
    NSLog(@"documenPath2:%@",documentPath2);
   
    //获取caches缓存目录
    NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachesPath = [caches lastObject];
    NSLog(@"cachesPath:%@",cachesPath);
   
    //获取临时目录
    NSString *tmp = NSTemporaryDirectory();
    NSLog(@"tmp:%@",tmp);
   
    //在documents目录下创建文件
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *fileName = [documentsPath stringByAppendingPathComponent:@"1.txt"];
    NSString *str = @"hello world";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
   
    if ([fm createFileAtPath:fileName contents:data attributes:nil]) {
        NSLog(@"file create successful");
    }
   
    //读出文件的内容
    NSError *error = nil;
   
    NSString *str2 = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:&error];
    if (!error) {
        NSLog(@"str2:%@",str2);
    }
    else
    {
        NSLog(@"%@",error);
    }
    //NSBundle对象:图片、xib、storyBoard、plist文件都是放在应用程序包中
    NSBundle *bundle = [NSBundle mainBundle];
    //获取包中文件的路径;
    NSString *path = [bundle pathForResource:@"array" ofType:@"plist"];
    //加载包中的xib文件
    NSArray *views  = [bundle loadNibNamed:@"cell" owner:self options:nil];
技术分享

 

用户偏好设置
练习:
技术分享
NSUserDefaults *userDeafults = [NSUserDefaults standardUserDefaults];
   
    [userDeafults setObject:@"admin" forKey:@"userName"];
    [userDeafults setObject:[NSDate date] forKey:@"loginDate"];
    [userDeafults setInteger:2 forKey:@"loginTimes"];
   
    //将偏好设置写到文件中去
    [userDeafults synchronize];//同步方法
   
    //获取home目录
    NSString *homePath = NSHomeDirectory();
    NSLog(@"%@",homePath);
 
 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *userName = [userDefaults objectForKey:@"userName"];
    NSDate *loginDate = [userDefaults objectForKey:@"loginDate"];
    NSString *loginTimes = [userDefaults objectForKey:@"loginTimes"];
    NSLog(@"%@,%@",userName,loginTimes);
    NSDateFormatter *df = [[NSDateFormatter alloc]init];
    df.dateFormat = @"MM-dd HH-mm-ss";
    NSLog(@"loginDate:%@",[df stringFromDate:loginDate]);
技术分享

 

注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘,应用程序就终止了。
出现以上问题,可以通过调用synchornize方法强制写入:
[defaults synchronize];

三、应用沙盒结构分析

应?程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 

Documents:保存应?运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录

tmp:保存应?运行时所需的临时数据,使?完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份该目录 

Library/Caches:保存应用运行时?成的需要持久化的数据,iTunes同步设备时不会备份该目录。?一般存储体积大、不需要备份的非重要数据 

Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置) 应?会在该?录中查找应?的设置信息。iTunes同步设备时会备份该目录
*参考了别人的请见谅(都是知识点,偷了一下懒)*

以上是关于IOS 沙盒机制 浅析的主要内容,如果未能解决你的问题,请参考以下文章

理解 iOS沙盒(sandbox)机制

iOS学习之iOS沙盒(sandbox)机制和文件操作

iOS学习之iOS沙盒(sandbox)机制和文件操作1

ios - 沙盒和NSBundle

iOS开发之沙盒机制(SandBox)

理解 iOS沙盒(sandbox)机制