【沙盒机制】:iPhone应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
【iphone的沙盒理解】:ios的ipa安装文件就如同一个个盒子一般,放在了/user/applications目录下,以这个程序(比如goodreader)的眼光看外面的世界,他基本什么也看不到,因为他的权限如此之小,以至于他看不到在goodreader的目录外,世界上还有什么?这也就是打开goodreader后不能打开其他程序内的文档的原因。ios的ipa可以随便乱装而不用担心会像windows一样产生很多垃圾文件,因为几乎一个程序所有的东西都放在/user/applications中,少部分在/applications中,有的程序可能获得了ios的官方支持,有了一些更大的权限(绝不会太大,比如官方ipa的qq即使登峰造极,他也不会像symbian系统一样,在桌面搞出个qq的信息小头像),会在其他位置生成一些文件(可能性很小),为了进一步防止恶意ipa程序通过非法途径破坏其他程序,ios进一步为每个文件夹起了一个随机名字,采用uuid方式,就是你现在看到的很长一串数字字母的目录名,这样防止了其他程序猜测其他程序的位置。
【沙盒文件夹的路径】:/Users/“用户名”/Library/Application Support/iPhoneSimulator/User/Applications/2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6/Documents/2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6是你的应用程序随机生成的编码,每个应用程序文件夹的名字都不一样
------------------------------------------------------------------------------------------------------------------------------------------
所以了解了沙盒机制后,我们研究一下怎么写入一个文件(比如图像文件)到沙盒中保存下来,以及iPhone应用程序如何读这个文件。
经常遇到要从网上下载图片并保存到Iphone本地,从国外网站上找了一个Demo,与国人分享一下。
参数说明:
NSData toretrieve the image from the URL
NSDocumentDirectory tofind Document folder’s Path
UIImagePNGRepresentation tosave it as PNG
UIImageJPEGRepresentation tosave it as JPEG
代码说话:
NSLog(@”Downloading…”);
// Get an image from the URL below
UIImage *image = [[UIImage alloc] initWithData:[NSDatadataWithContentsOfURL:[NSURLURLWithString:@"http://www.objectgraph.com/images/og_logo.png"]]];
NSLog(@”%f,%f”,image.size.width,image.size.height);
// Let’s save the file into Document folder. 即一下路径(/Users/“用户名”/Library/ApplicationSupport/iPhoneSimulator/User/Applications/2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6/Documents/2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6/Document)
NSString *docDir =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
// If you go to the folder below, you will find thosepictures
NSLog(@”%@”,docDir);// 以png图片类型存储数据到Document文件夹下
NSLog(@”saving png”);
NSString *pngFilePath = [NSStringstringWithFormat:@"%@/test.png",docDir];
NSData *data1 = [NSDatadataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:YES];NSLog(@”saving jpeg”);
NSString *jpegFilePath = [NSStringstringWithFormat:@"%@/test.jpeg",docDir];
NSData *data2 = [NSDatadataWithData:UIImageJPEGRepresentation(image, 1.0f)];//1.0f = 100%quality
[data2 writeToFile:jpegFilePath atomically:YES];NSLog(@”saving image done”);
[image release];
--------------------------------------------------------------------------------------------------
存放完了,那我们要去读取这些文件
//拿到应用程序沙盒里面的路径
NSArray*paths =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
//读取存在沙盒里面的文件图片
NSString*imgPath=[[paths objectAtIndex:0]stringByAppendingPathComponent:@"bgimage.png"];
//因为拿到的是个路径 把它加载成一个data对象
NSData*data=[NSDatadataWithContentsOfFile:imgPath];
//直接把该图片读出来
UIImage*img=[UIImage imageWithData:data];