iOS沙盒机制

沙盒

1,每个app下都有一个独立的沙盒目录,就是该app的文件目录,跟其他的app沙盒是相互隔离的,他们之间不能进行数据间的访问.
2,app所有非代码文件都保存在沙盒中,比如plist,文本,文件夹,图片,图标,音视频等等.

获取沙盒不同文件夹的路径

沙盒基本目录结构
1
2
3
4
5
            /Doucuments
/Library
sandbox: /Library/Preferences
/Library/Caches
/Tmp
沙盒路径读取

主路径

1
2
3
//沙盒在模拟器或者真机中的主路径
NSString *home = NSHomeDirectory();
NSLog(@"沙盒主路径:\n%@",home);

Documents
保存app重要数据(如FMDB,下载的图片和音视频),该文件夹下文件会在程序更新时自动备份,连接itunes会进行备份.

1
2
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]; 
NSLog(@"document路径:\n%@",docPath);

Library
下有2个子文件夹(Preferences和Caches),保存不希望给用户看到的数据,可以自主创建文件,除了caches外,都会被itunes备份.

1
NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

Library下Preferences路径
保存程序的偏好设置,如NSUserDefaults,plist(允许权限说明)等,会被itunes备份.

1
NSString *prePath = [NSString stringWithFormat:@"%@%@",libPath,@"/Preferences"];

Library下Caches路径
保存程序运行的时候产生支持文件和缓存文件,iTunes不会备份该目录而且会被其他工具清除.

1
NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

Tmp路径
程序运行时的临时数据,不会被iTunes备份,手机重启时,会被清空.

1
NSString *tmpPath = NSTemporaryDirectory();

获取路径函数:C函数

1
2
3
4
5
1,返回值是一个字符串数组: NSArray<NSString *>
2,NSSearchPathDirectory 枚举,想要查找的目录,有iOS,MacOS,watchOS的,iOS用到:NSDocumentDirectory,NSLibraryDirectory,NSCachesDirectory
3,NSSearchPathDomainMask 枚举,查找范围:NSUserDomainMask iOS的:当前用户
4,expandTilde BOOL值,YES的时候,全部路径都会展示;NO的时候,前面的会省略(如caches路径会变成:~Caches)
NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

获取某个文件夹路径下一级目录和所有目录

主路径下的所有目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
NSArray * subArr = [[NSFileManager defaultManager] subpathsAtPath:home];
NSLog(@"subArr = %@",subArr);
subArr = (
".DS_Store",
".com.apple.mobile_container_manager.metadata.plist",
Library,
"Library/Saved Application State",
"Library/Saved Application State/work.Sandbox----.savedState",
"Library/Saved Application State/work.Sandbox----.savedState/KnownSceneSessions",
"Library/Saved Application State/work.Sandbox----.savedState/KnownSceneSessions/data.data",
"Library/Preferences",
"Library/SplashBoard",
"Library/SplashBoard/Snapshots",
"Library/SplashBoard/Snapshots/work.Sandbox---- - {DEFAULT GROUP}",
"Library/SplashBoard/Snapshots/work.Sandbox---- - {DEFAULT GROUP}/DE69DCF5-A4F3-4F0B-B5A0-74368B24E796@2x.ktx",
"Library/SplashBoard/Snapshots/work.Sandbox---- - {DEFAULT GROUP}/6D660E24-4C00-47D1-BC75-42D929F9969B@2x.ktx",
"Library/SplashBoard/Snapshots/work.Sandbox---- - {DEFAULT GROUP}/301F834A-80C7-4AF2-8AA6-C16369B5A90D@2x.ktx",
"Library/SplashBoard/Snapshots/work.Sandbox---- - {DEFAULT GROUP}/2F1A81AA-A919-4542-967B-225EB2DED409@2x.ktx",
"Library/Caches",
Documents,
"Documents/file1",
tmp,
Documentsfile1,
SystemData
)
Docments路径下的一级文件
1
2
3
4
5
6
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
NSArray *arr2 = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:docPath error:nil];
NSLog(@"某个文件下的所有一级文件 = %@",arr2);
(
file1
)