ios沙盒存储图片
A. 在ios沙盒机制下下面哪个文件夹是用来存放数据的
IOS沙盒机制(SandBox)种安全体系规定应用程序能该应用创建文件夹内读取文件访问其内容所非代码文件都保存比图片、声音、属性列表文本文件等
1.每应用程序都自沙盒内
2.能随意跨越自沙盒访问别应用程序沙盒内容
3.应用程序向外请求或接收数据都需要经权限认证
查看模拟器沙盒文件夹Mac电脑存储位置首先文件夹隐藏所要先些文件显示打命令行:
显示Mac隐藏文件命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件命令:defaults write com.apple.finder AppleShowAllFiles -bool false
重新启Finder点击屏幕左角苹标志——强制退——选择Finder点击重新启候重新打Finder看隐藏文件
种比较简单办直接点击Finder图标右键——前往文件夹——输入/Users/your username/Library/Application Support/iPhone Simulator/ ,确认your username本机用户名
B. ios 存储沙盒偏好设置和其他的区别
Xcode6沙盒路径与Xcode5沙盒路径对比:
(1)Xcode5中沙盒的路径为:/Users/用户名/Library/Application
Support/iPhone Simulator/7.1-64/Applications/对应应用程序文件夹
通过以上可以看出通过NSUserDefault创建的plist文件真正存放的位置发生了变化,成了在模拟器的资料库文件夹下的Preferences文件夹下,也就是说当我们在删除模拟器中的应用程序后,真正的plist文件是不会被删除的,如果需要清除偏好设置文件需要手动到对应的目录下删除!当然这只是在模拟器的情况下,真机上应该是不会出现这种问题的,具体情况可以尝试下。
C. iOS 怎么从沙盒中加载 一个 zip 包和一个资源文件夹
这肯定的啊,因为用[UIImage imageNamed:question.icon]是直接从当前的项目中读取文件,可以实现; 而NSString *path = [[NSBundle mainBundle] pathForResource:question.icon];是从沙盒路径中读取文件,只用question.icon是不够的,应该加上当前的沙盒路径,如果你的沙盒路径中还有一个存放图片的文件夹的话,还要加上这个文件夹的名字,question.icon应该改为: 沙盒路径/文件夹名/question.icon 具体实现是这样的: //程序包的根目录(沙盒路径) NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; //完整的图片路径,如果图片是放在文件夹中的话,还要在中间加上文件夹的路径 NSString *imagepath = [resourcePath :@”question.icon“]; //可以打印路径看看是什么情况 NSlog(@“%@”,imagePath); UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
D. ios的应用沙箱运行是怎么一回事
1、IOS沙盒机制
IOS应用程序只能在本应用程序中创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
1.1、每个应用程序都有自己的存储空间
1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
2、打开模拟器沙盒目录
下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。
文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,英文名是Library。
下面介绍一种简单方法前往该文件夹:在Finder上点->前往->前往文件夹
进入模拟器后,里面就包含了各个应用程序的沙盒。
进入一个应用程序,如下图,就是一个沙箱了。
下面介绍一下沙箱的目录结构:
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp和一个应用程序文件(也是一个文件)。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
注意:这里很容易和bundle混淆在一起,下面根据自己的一点理解说明二者的区别:
bundle :生成 iOS 应用程序时,Xcode 将它捆绑成一个包。捆绑包 (bundle) 是文件系统中的一个目录,它将相关资源成组在一个地方。一个 iOS 应用程序捆绑包中,含有其可执行文件和支持资源文件(如应用程序图标、图像文件和已本地化的内容)。
A bundle(包裹、捆、束) is a directory with a standardizedhierarchical structure that holds executable code and the resources used by that code.
所以可以将整个应用程序其实就可以看做一个bundle。
沙箱的概念和bundle没直接关系,沙箱只是说明程序资源与外界隔离
下面通过一个简单的例子说明一下bundle和sandbox。
//新建的plist文件是在应用程序中的,可以通过bundle存取到该文件
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"];
NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];
//向数组中新添加一个项目
[array addObject:@"3"];
//重新写回plist文件中
BOOL value = [array writeToFile:plistPath atomically:YES];
if (value) {
NSMutableArray *newArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
NSLog(@"new array = %@",newArray);
}
/* 输出:
new array = (
0,
1,
2,
3
)
*/
//获取沙箱中document的path
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *newPath = [documentsDirectory :@"data.plist"];
//将数组写入到沙箱的document中的data.plist文件中
[array writeToFile:newPath atomically:YES];
NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:newPath];
NSLog(@"array in data.plist = %@",arr);
/* 输出:
array in data.plist = (
0,
1,
2,
3
)
*/
说明:我们首先在项目中新建一个plist文件(root项的类型为数组),添加了3个元素。因为新建的plist文件是在应用程序中的,我们可以通过bundle获取到这个plist文件,读取出这个数组,添加一个数据元素后,重新写回plist文件中。接着我们获取沙箱document的path,然后将这个文件写入到沙箱中的data.plist文件中(如果不存在,会自动新建一个的),然后再从data.plist读取出这个数组。
关于新建的MyPlist.plist文件,我们写回文件的数组中添加了一项新的元素,但是我们在xcode中查看这个MyPlist.plist文件时,发现并没有显示出新增的数组元素,但是我们到沙箱中查看就可以看到了,这个估计是xoode本身的问题。
关于document中data.plist文件查看我们也可以到沙箱中进行查看。如下图:
3、获取沙盒目录:
//1、获取程序的Home目录
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671
//2、获取document目录
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Documents
//3、获取Cache目录
NSArray *paths = (NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Library/Caches
//4、获取Library目录
NSArray *paths = (NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Library
//5、获取tmp目录
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"path:%@", tmpDir);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/tmp/
4、文件操作之NSFileManager
4.1 、在document中创建一个文件目录
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory :@"test"];
// 创建目录
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
4.2 、 在test目录下创建文件
创建文件怎么办呢?接着上面的代码 testPath 要用拼接上你要生成的文件名,比如test11.txt。这样才能在test目录下写入文件。
testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test11.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。
实现代码如下:
NSString *testPath1 = [testDirectory :@"test1.txt"];
NSString *testPath2 = [testDirectory :@"test2.txt"];
NSString *testPath3 = [testDirectory :@"test3.txt"];
NSString *string = @"写入内容,write String";
[fileManager createFileAtPath:testPath1 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath2 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath3 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
4.3获取目录列里所有文件名
两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPath
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [documentsDirectory :@"test"];
//方法一
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%@",file);
//方法二
NSArray *files = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%@",files);
获取刚才test目录下的所以文件名:
两种方法都是输出
(
"test1.txt",
"test2.txt",
"test3.txt"
)
4.4 、fileManager使用操作当前目录
//创建文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//更改到待操作的目录下
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
//创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
NSString * fileName = @"testFileNSFileManager.txt";
NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];
//下面是将数组类型转换为NSData类型
NSMutableData *data = [[NSMutableData alloc] init];
for (int i = 0; i < [array count]; ++i ){
NSString *str = [array objectAtIndex:i];
NSData *temp = [str dataUsingEncoding:NSUTF8StringEncoding];
[data appendData:temp];
}
//注意contents参数的类型是NSData类型
[fileManager createFileAtPath:fileName contents:data attributes:nil];
4.5 删除文件
接着上面的代码就可以将刚新建的 testFileNSFileManager.txt文件删除!
[fileManager removeItemAtPath:fileName error:nil];
4.6 混合数据的读写 请参看原文最后面的内容。
E. ios开发 plist可以保存图片么
可以保存图片地址,也可以将图片保存为data,但是不建议后者,因为这回导致plist文件过大,从而加载缓慢,影响其他数据的展示,如果保存图片地址的话,就可以开一个单独的线程加载图片,同事又不影响其他数据展示。。。又需要的话欢迎追问。。。
F. ios沙盒机制下 哪个文件存放数据
IOS 从Resource文件夹下Copy文件到沙盒
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"拷贝文件到Sandbox";
//文件类型
NSString * docPath = [[NSBundle mainBundle] pathForResource:@"save1" ofType:@"dat"];
// 沙盒Documents目录
// NSString * appDir = [(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 沙盒Library目录
NSString * appDir = [(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
//appLib Library/Caches目录
NSString *appLib = [appDir stringByAppendingString:@"/Caches"];
BOOL filesPresent = [self MissingFile:docPath toPath:appLib];
if (filesPresent) {
NSLog(@"OK");
}
else
{
NSLog(@"NO");
}
// 创建文件夹
NSString *createDir = [NSHomeDirectory() stringByAppendingString:@"/test"];
[self createFolder:createDir];
// 把文件拷贝到Test目录
BOOL filesPresent1 = [self MissingFile:docPath toPath:createDir];
if (filesPresent1) {
NSLog(@"OK");
}
else
{
NSLog(@"NO");
}
}
/**
* @brief 把Resource文件夹下的save1.dat拷贝到沙盒
*
* @param sourcePath Resource文件路径
* @param toPath 把文件拷贝到XXX文件夹
*
* @return BOOL
*/
- (BOOL)MissingFile:(NSString *)sourcePath toPath:(NSString *)toPath
{
BOOL retVal = YES; // If the file already exists, we'll return success…
NSString * finalLocation = [toPath :[sourcePath lastPathComponent]];
if (![[NSFileManager defaultManager] fileExistsAtPath:finalLocation])
{
retVal = [[NSFileManager defaultManager] ItemAtPath:sourcePath toPath:finalLocation error:NULL];
}
return retVal;
}
/**
* @brief 创建文件夹
*
* @param createDir 创建文件夹路径
*/
- (void)createFolder:(NSString *)createDir
{
BOOL isDir = NO;
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL existed = [fileManager fileExistsAtPath:createDir isDirectory:&isDir];
if ( !(isDir == YES && existed == YES) )
{
[fileManager createDirectoryAtPath:createDir withIntermediateDirectories:YES attributes:nil error:nil];
}
}
G. 在ios沙盒机制下,哪个文件用来存放数据
何查看、管理ios模拟器文件 ios模拟器路径-打沙盒路径 1、模拟器沙盒目录 文件都用户名文件夹隐藏文件夹文叫资源库目录其实Library 1.1 1、设置显示隐藏文件Finder直接打
H. ios什么时候用沙盒和什么时候用数据库
IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
3.应用程序向外请求或接收数据都需要经过权限认证
查看模拟器的沙盒文件夹在Mac电脑上的存储位置,首先,这个文件夹是被隐藏的,所以要先将这些文件显示出来,打开命令行:
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
然后重新启动Finder,点击屏幕左上角苹果标志——强制退出——选择Finder然后点击重新启动,这个时候在重新打开Finder就可以看到被隐藏的文件了。
还有一种比较简单的办法就是直接点击Finder图标右键——前往文件夹——输入/Users/your username/Library/Application Support/iPhone Simulator/ ,然后确认就可以了。your username是你本机的用户名