iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒。每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme。沙盒里面的文件可以是照片、声音文件、文本、属性列表等。
沙盒机制介绍
沙盒简述:
1.每一个APP都有一个存储空间,就是沙盒.
2.APP之间不能互相通信
3.沙盒根目录结构:Documents, Library, temp
简述一下Documents, Library, temp的区别:
1.Documents: 用于存储用户数据, iTunes备份和恢复的时候会包括此目录, 所以, 苹果建议将程序中建立的或在程序中浏览到的文件保存在改目录下.
2.Library: 包含两个子目录 : Caches和Preferences. Caches用来存放用户需要换成的文件, Preferences是APP的偏好设置, 可以通过NSUserDefaults来读取和设置.
3.tmp: 用于存放临时文件,这个可以放一些当APP推出后不需要的文件
打开模拟器沙盒方法
方法一:前往文件夹打开
/Users/ligang/Library/Application Support/iPhone Simulator/
直接在Finder->前往->前往文件夹,输入上面的内容即可。记住将ligang换成你的电脑用户名。
方法二:通过Finder一步步查找
模拟器上的APP的沙盒实在用户目录下的资源库里面,但是资源库是隐藏文件夹。所以查看沙盒之前,现将隐藏文件夹显示出来。显示隐藏文件的命令:
defaults write com.apple.finder AppleShowAllFiles -bool true
用心的童鞋会发现,隐藏隐藏文件的命令:
defaults write com.apple.finder AppleShowAllFiles -bool false
查找步骤请看图:
iOS开发之获取沙盒路径
获取沙盒根目录
获取沙盒根目录,直接调用NSHomeDirectory():
//获取沙盒根目录
NSString *directory = NSHomeDirectory();
NSLog(@"directory:%@", directory);
控制台输出:
2015-07-22 00:40:16.185 iOSStrongDemo[1605:555658] directory:/var/mobile/Containers/Data/Application/F9418815-51A9-4A0A-A76C-6FD37C400928
这个是真机的路径,大家有时间的话可以看看模拟器的根目录路径。
获取Documents路径
获取Documents路径如下:
//获取Documents路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
控制台输出:
2015-07-22 00:41:41.397 iOSStrongDemo[1613:556159] path:/var/mobile/Containers/Data/Application/A62B886B-A8F0-4215-B59D-1F505C3997BD/Documents
获取Documents文件夹目录,第一个参数是说明获取Doucments文件夹目录,第二个参数说明是在当前应用沙盒中获取。
获取Library路径
//获取Library路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
控制台输出:
2015-07-22 00:43:15.803 iOSStrongDemo[1619:556638] /var/mobile/Containers/Data/Application/17300507-4643-4DE7-BC68-E13DB19C8D98/Library
获取Caches路径
//获取Caches路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
控制台输出:
2015-07-22 00:44:31.383 iOSStrongDemo[1626:557083] path:/var/mobile/Containers/Data/Application/1E945B52-E29D-4041-A489-1AA1B11BB960/Library/Caches
获取tmp路径
NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@", tmp);
控制台输出:
2015-07-22 00:46:07.846 iOSStrongDemo[1632:557537] tmp:/private/var/mobile/Containers/Data/Application/4BE02307-1CC5-47E8-BEA8-CEBB7ED5A402/tmp/
以上是iOS开发中获取沙盒路径的方法,也许还有更好的获取方法等待我们去发现。后面我们还会讲到关于在沙盒里进行读写文件操作。
//
// Boss.h
#import <Foundation/Foundation.h>
@interface Boss : NSObject<NSCoding>
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *gender;
@property (nonatomic, assign) NSInteger number;
@property (nonatomic, assign) NSInteger phone;
@end
//
// Boss.m
#import "Boss.h"
@implementation Boss
- (void)encodeWithCoder:(NSCoder *)aCoder{
//编码的方法, 本质上是把分布在内存不同位置的数据集合起来生成一个NSData
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.gender forKey:@"gender"];
[aCoder encodeInteger:self.number forKey:@"number"];
[aCoder encodeInteger:self.phone forKey:@"phone"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
//解码方法, 本质上是把NSData数据按照编码的key 一个个读取出来 重新给一个新的对象赋值的过程
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.gender = [aDecoder decodeObjectForKey:@"gender"];
self.number = [aDecoder decodeIntegerForKey:@"number"];
self.phone = [aDecoder decodeIntegerForKey:@"phone"];
}
return self;
}
- (void)dealloc{
[_gender release];
[_name release];
[super dealloc];
}
@end
#import "MainViewController.h"
#import "Boss.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
NSLog(@"%@", NSHomeDirectory());
//沙盒中的文件夹
//1.Documents:文档文件夹,保存用户的数据,最好不要保存体积很大的文件
//2.Caches:缓存文件夹,应用程序的缓存内容(图片/数据/视频/音频....)
//3.Preferences:偏好设置文件夹,给开发者保存数据使用
//4.tmp:临时文件夹,
//把简单对象写入本地
//一 .字符串写入本地
NSString *str = @"你好";
// 创建一个文件路径
// 获取Documents文件夹得路径
//参数1: 要找哪个文件夹得路径
//参数2; 寻找范围
//参数3: 是不是绝对路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
//拼接一个文件名, 生成一个文件路径
NSString *strPath =[docPath stringByAppendingFormat:@"/aaa.txt"];
//参数1;文件路径
//参数2:对写入过程进行线程保护
//参数3:编码形式
[str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"文件路径: %@", strPath);
NSString *str1 = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"*****%@", str1);
//二. 数组写入本地
NSArray *arr = @[@"张家玮", @"王威武"];
NSString *arrPath = [docPath stringByAppendingPathComponent:@"arr.plist"];
[arr writeToFile:arrPath atomically:YES];
//三. 字典写入本地
NSDictionary *dic = @{@"key":@"value", @"key1":@"value1"};
NSString *dicPath = [docPath stringByAppendingPathComponent:@"dic.xml"];
[dic writeToFile:dicPath atomically:YES];
//根据路径读取数据
NSArray *readArr = [NSArray arrayWithContentsOfFile:arrPath];
NSLog(@"%@", readArr);
//四. 复杂对象写入本地
//自己创建的类产生的对象,叫复杂对象
Boss *boss = [[Boss alloc] init];
boss.name = @"张家玮";
boss.gender = @"unknown";
boss.number = 2;
boss.phone = 120;
NSString *bossPath = [docPath stringByAppendingPathComponent:@"boss.suibian"];
//归档类:负责把一个对象, 写入本地/生成NSData
[NSKeyedArchiver archiveRootObject:boss toFile:bossPath];
//反归档类: 负责读取本地的数据, 产生一个新的对象
Boss *newBoss = [NSKeyedUnarchiver unarchiveObjectWithFile:bossPath];
NSLog(@"%@", newBoss.name);
}