介绍
每一个APP都有一个存储空间,就是沙盒。APP之间不能相互通信。沙盒根目录结构:Documents、Library、temp。
iOS的沙盒下面主要包含该以下三个文件:
Home.png
路径是这样的:
// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory(); // 模拟器下的路径 /Users/apple/Library/Developer/CoreSimulator/Devices/12E868D1-2332-4215-B25E-3D5C8E3D1B07/data/Containers/Data/Application/3AE2AB9E-053B-41BF-B3D0-688F96A0D2F1 // 真机下的路径 /var/mobile/Containers/Data/Application/8194D1EB-4026-49F6-ADAD-458355533828 // 应用的标识再往下就是沙盒了.系统生成. (3AE2AB9E-053B-41BF-B3D0-688F96A0D2F1), (8194D1EB-4026-49F6-ADAD-458355533828)
*注:每次编译代码会生成新的沙盒, 注意是编译不是启动,所以模拟器或者真机运行你每次运行所得到的沙盒路径都是不一样,就是上面提到的标识符不一样,正式版app真机的话启动杀死,不会生成新的沙盒.
一、Documents
// 获取Documents目录路径 NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
A 此文件夹是默认备份的,备份到iCloud
注:iCloud的备份,会通过Wi-Fi每天自动备份用户iOS设备。
1.app的home目录下的所有东西都会被备份,除了应用Bundle本身、缓存目录和temp目录。
2.已购买的音乐、应用、书籍、Camera Roll、设备设置、主屏幕、App组织、消息、铃声也都会被备份。
3.由于备份通过无线进行,并且为每个用户存储在iCloud中,应用需最小化自己存储的数据数量。
4.大文件会延长备份时间,并且消耗用户的可用iCloud空间。
B大文件要做 非备份设置(如视频) 审核的时候会被拒:
// 非备份设置代码如下 // 需要导入 #include - (BOOL)addShipBackUpAttributeToUrl:(NSString *)url { NSURL *itemUrl = [NSURL URLWithString:url]; const char *filePath = [[itemUrl path] fileSystemRepresentation]; const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); return result == 0; }
C此目录储存规则
关键数据
用户创建的数据,或者不能重新生成的数据。
应该存放在
关键数据在低存储空间时也会保留,而且会被iCloud或iTunes备份。
D经常存储的一些东西
1.APP的数据库表.
2.必要的一些图标本地缓存.
3.重要的plist文件,如当前登录人的信息.
二、Library
里面包括两个文件夹
Library.png
// 获取Library的目录路径 NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
A、Caches
储存规则
// 获取Caches目录路径 NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
缓存数据
可以重新下载或生成的数据,而且没有这些数据也不会妨碍用户离线使用应用的功能。
缓存数据应该保存在
缓存数据在设备低存储空间时可能会被删除,iTunes或iCloud不会对其进行备份。
系统的缓存都放在这个文件夹下面(主要是网路).
当访问网络时系统自动会把访问的url,以数据库的方式存放在此目录下面.
Caches.png
其中一个数据库的内容:
url.png
Snapshots默认文件夹
// 系统截图文件夹, 我们没有权限访问
Snapshots .png
B、Preferences(默认备份的)
NSUserDefaults就是默认存放在此文件夹下面,如下代码
// 获取Preferences目录路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *preferences = [[paths firstObject] stringByAppendingString:@"/Preferences"]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@"有毒的程序猿" forKey:@"firstName"]; [defaults setInteger:100 forKey:@"age"]; [defaults synchronize]; // 这里NSUserDefaults 是以key - value的形式存储为.plist文件. // 在这不得不多说一下[defaults synchronize]的作用. // 其实可以不调用,文件也可以正常存储,不过就是异步的. // [defaults synchronize] 起到了立刻储存的作用.
Preferences.png
三、tmp
临时文件夹(系统会不定期删除里面的文件)
// 获取tmp目录路径 NSString *tmpDir = NSTemporaryDirectory();
应用需要写到本地存储,内部使用的临时数据,但不需要长期保留使用。
临时数据应该保存在
系统可能会清空该目录下的数据,iTunes或iCloud也不会对其进行备份。
应用在不需要使用这些数据时,应该尽快地删除临时数据,以避免浪费用户的存储空间。
四、SystemData
新加入的一个文件夹, 存放系统的一些东西,暂时没研究其用法,有兴趣的同学可以研究其储存规则.