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,沙盒路径都会变,最后的文件名不变