SandBox,沙盒机制,是一种安全体系。我们所开发的每一个应用程序在设备上会有一个对应的沙盒文件夹,当前的程序只能在自己的沙盒文件夹中读取文件,不能访问其他应用程序的沙盒。在项目中添加的所有非代码的资源,比如图片、声音、属性列表等都存在自己的沙盒中。此外,在程序运行中动态生成的或者从网络获取的数据,如果要存储,也都是存储到沙盒中。

获取沙盒文件:

获取模拟器的沙盒文件

使用断点,在控制台选中输入  po  NSHomeDirectory()

复制沙河路径,点击一下桌面空白处,command+shift+G,粘贴沙盒路径,回车即可

2.获取真机的沙盒路径

  选择Xcode导航栏中的 Window -> Devices

  左侧选择手机,右侧选择需要的app

  双击需要的app,会出现一个界面,以name+版本号+container命名,但是里面的内容需要加载一段时间,并且内容只能阅读

  在所有app的下方存在以 "+",  "-", "齿轮" 构成的区域,左击齿轮,选择 Download Container,进行下载

 右击下载包,选择显示包内容,选择AppData,里面就是沙盒文件夹

NSUserDefaults 数据时保存在 沙盒里面的,会随着软件删除而被清空。


 


Application Bundle:包含应用可执行文件和所有资源文件,只读。

Document/ 存放应用运行时生成的并且需要保存的数据。iTunes或iCloud同步设备时备份该目录。

Library/Caches/ 存放应用运行时生成的并且需要保存的数据。iTunes或iCloud不同步。

Library/Preferences/ 存放偏好设置。ios的偏好设置(settings)应用也会在该目录查找应用的设置信息。NSUserDefaults保存在该目录下。iTunes或iCloud同步设备时备份该目录。

temp/ 存放应用运行时所需的临时数据。当某个应用没运行时,ios系统可能会清除该目录下的文件。但不可依赖这种自动清除机制,应该及时手动清除。

 

1、获取沙盒根目录的方法

NSString *homeDir = NSHomeDirectory();

2、获取Document路径

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

NSString *docDir = [paths objectAtIndex:0];

3、 获取Caches路径

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

NSString *cachesDir = [paths objectAtIndex:0];

 

4、获取tmp路径

NSString *tmpDir = NSTemporaryDirectory();


 


iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
  1.1、每个应用程序都有自己的存储空间
  1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
  1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
  从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。


 

//使用的时候需要重新拼接存储路径
/**
 *documentstr   中间文件夹的名字
 *filePath      原来的路径
 **/
-(NSString *)repinjiestorePathWithdocumentstr:(NSString *)documentstr filepath:(NSString *)filePath{
    //重新拼接路径,每一次重新打包app,沙盒路径都会变,最后的文件名不变
    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    //自定义新的文件夹video
    NSString *video = [documentPath stringByAppendingPathComponent:documentstr];
    NSString *fileName = [filePath componentsSeparatedByString:@"/"].lastObject;
    NSString *newsPath = [video stringByAppendingPathComponent:fileName];
    return newsPath;
}

//偏好存储
-(void)defaultStoreObject:(NSString *)filepathstr cameraname:(NSString *)cameraname key:(NSString *)preorbackkey{
    //存储偏好设置
    NSUserDefaults *predefault=[NSUserDefaults standardUserDefaults];
    NSArray *pretemparr=[predefault objectForKey:preorbackkey];
    NSMutableArray *prefilepatharr=nil;
    if(!pretemparr){
        prefilepatharr=[[NSMutableArray alloc]init];
    }else {
        prefilepatharr=[NSMutableArray arrayWithArray:pretemparr];
    }
    if(filepathstr &&![filepathstr isEqualToString:@""]){
        NSDictionary *dict=@{@"cameraname":cameraname?cameraname:@"",@"filepath":filepathstr?filepathstr:@""};
        [prefilepatharr addObject:dict];
    }
    [predefault  setObject:prefilepatharr forKey:preorbackkey];
    [predefault synchronize];
}


//读取偏好存储
-(NSArray *)readDefaulfStoreobjectWithkey:(NSString *)preorbackkey{
    NSUserDefaults *predefault=[NSUserDefaults standardUserDefaults];
    NSArray *pretemparr=[predefault objectForKey:preorbackkey];
    NSArray *prefilepatharr=nil;
    if(!pretemparr){
        prefilepatharr=[[NSArray alloc]init];
    }else {
        prefilepatharr=pretemparr;
    }
    return prefilepatharr;
}
//删除所有沙盒缓存
-(void)delAlldatasWith:(NSString *)preorback{
    NSArray *prearr=[[HximCommanManager sharedCommonManager] readDefaulfStoreobjectWithkey:preorback];
    for (int i=0; i<prearr.count; i++) {
        NSDictionary *dict=prearr[i];
        NSString *filePath=dict[@"filepath"];
        //重新拼接路径,每一次重新打包app,沙盒路径都会变,最后的文件名不变
        NSString *documentstr=@"";
        if([preorback isEqualToString:@"prefilepath"]){
            documentstr=@"prevideo";
        }else if([preorback isEqualToString:@"backfilepath"]){
            documentstr=@"backvideo";
        }else if([preorback isEqualToString:@"capture"]){
            documentstr=@"capture";
        }
        NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        //自定义新的文件夹video
        NSString *video = [documentPath stringByAppendingPathComponent:documentstr];
        NSString *fileName = [filePath componentsSeparatedByString:@"/"].lastObject;
        NSString *newsPath = [video stringByAppendingPathComponent:fileName];
        [[NSFileManager defaultManager]removeItemAtPath:newsPath error:nil];
    }
    NSUserDefaults *predefault=[NSUserDefaults standardUserDefaults];
    [predefault removeObjectForKey:preorback];
}
//钥匙串存储
-(void)keychainstoreWith:(NSString *)filepathstr cameraname:(NSString *)cameraname key:(NSString *)preorbackkey identifier:(NSString *)keychainidentifier{
        KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]
                                        initWithIdentifier:keychainidentifier accessGroup:nil];
    
    NSArray *pretemparr=[wrapper objectForKey:preorbackkey];
    NSMutableArray *prefilepatharr=nil;
    if(!pretemparr){
        prefilepatharr=[[NSMutableArray alloc]init];
    }else {
        prefilepatharr=[NSMutableArray arrayWithArray:pretemparr];
    }
    if(filepathstr &&![filepathstr isEqualToString:@""]){
        NSDictionary *dict=@{@"cameraname":cameraname?cameraname:@"",@"filepath":filepathstr?filepathstr:@""};
        [prefilepatharr addObject:dict];
    }
        [wrapper setObject:prefilepatharr forKey:preorbackkey];
    

}

//从钥匙串中取
-(NSArray *)getdatafromkeychainWithkey:(NSString *)preorbackkey identifier:(NSString *)keychainidentifier{
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]
                                    initWithIdentifier:keychainidentifier accessGroup:nil];
    
//    NSString *username = [wrapper objectForKey:(id)kSecAttrAccount];
//    NSString *password = [wrapper objectForKey:(id)kSecValueData];
    NSArray *pretemparr = [wrapper objectForKey:preorbackkey];
    NSArray *prefilepatharr=nil;
    if(!pretemparr){
        prefilepatharr=[[NSArray alloc]init];
    }else {
        prefilepatharr=pretemparr;
    }
    
    return prefilepatharr;
}
   //清空钥匙串
-(void)clearKeychainWithidentifier:(NSString *)keychainidentifier{
 
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]
                                    initWithIdentifier:keychainidentifier accessGroup:nil];
    [wrapper resetKeychainItem];
}

重新运行app沙盒路径失效的问题:解决--//重新拼接路径,每一次重新打包app,沙盒路径都会变,最后的文件名不变