iOS沙盒机制

简介:

一、简介

  • 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。

    • 应用必须待在自己的沙盒里,其他应用不能访问该沙盒

二、应用沙盒目录

  • Application应用程序包:包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改

  • Documents:保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图

    • 注意点:不要保存从网络上下载的文件,否则会无法上架!

  • Library

    • 用户偏好,使用 NSUserDefault 直接读写!

    • 如果要想数据及时写入磁盘,还需要调用一个同步方法

    • 保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)

    • 系统不会清理 cache 目录中的文件

    • 就要求程序开发时,"必须提供 cache 目录的清理解决方案"

    • Caches:存放体积大又不需要备份的数据

    • Preference:保存应用的所有偏好设置,iCloud会备份设置信息

  • tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能

    • 保存临时文件,"后续不需要使用"

    • tmp 目录中的文件,系统会自动清理

    • 重新启动手机,tmp 目录会被清空

    • 系统磁盘空间不足时,系统也会自动清理

三、应用沙盒目录的常见获取方式

?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
         // 沙盒根目录
         NSString *homeDir = NSHomeDirectory();
         NSLog(@ "homeDir: %@" , homeDir);
         
         // 获取tmp目录
         NSString *tmpDir = NSTemporaryDirectory();
         NSLog(@ "tmpDir: %@" , tmpDir);
         
         // NSUserDomainMask 代表从用户文件夹下找
         // YES 代表展开路径中的波浪字符“~”
         // 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素NSString*documents =[array objectAtIndex:0];
         NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) objectAtIndex:0];
         NSLog(@ "Documents: %@" , documents);
         
         // 获取Documents目录
         // NSSearchPathForDirectoriesInDomains(要查找的目录, 是否是用户主目录, YES/NO 是否获取全路径);
         NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
         NSLog(@ "Documents: %@" , [arr1 lastObject]);
         
         // 获取Library目录
         NSArray *arr2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
         NSLog(@ "Library: %@" , [arr2 lastObject]);
         
         // 获取Library/Caches目录
         NSArray *arr3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
         NSLog(@ "Caches: %@" , [arr3 lastObject]);
         
         // 获取Library/Preferences目录
         NSArray *arr4 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
         NSString *path = [arr4 lastObject];
         path = [path stringByAppendingPathComponent:@ "Preferences" ];
         NSLog(@ "Preferences: %@" , path);
         
         // 写入文件到指定的文件夹下
         NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) objectAtIndex:0];
         path2 = [path2 stringByAppendingPathComponent:@ "Preferences/test.txt" ];
         NSString *str = @ "Jacedy" ;
         [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
         
         // 创建目录
         NSFileManager *fileManager = [NSFileManager defaultManager];
         NSString *testDir = [path2 stringByAppendingPathComponent:@ "test" ];
         [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
         if  ([fileManager fileExistsAtPath:testDir]) {
             NSLog(@ "It is exist" );
         }


?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 文件操作
- ( void )fileManage
{
     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
     
#pragma mark - NSString写入文件
     NSString *txtPath = [docPath stringByAppendingPathComponent:@ "bada.txt" ]; // 此时仅存在路径,文件并没有真实存在
     NSString *string = @ "莽荒记" ;
     [string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 字符串写入时执行的代码
     NSLog(@ "%@" , txtPath);
     
#pragma mark - NSData写入文件
     NSString *dataPath = [docPath stringByAppendingPathComponent:@ "icon.jpg" ];
     UIImage *image = [UIImage imageNamed:@ "640*960.jpg" ];
     NSData *data = UIImageJPEGRepresentation(image, 1.0);
     [data writeToFile:dataPath atomically:YES];
     NSLog(@ "dataPath: %@" , dataPath);
     
#pragma mark - 创建文件夹
     NSFileManager *fileManager = [NSFileManager defaultManager];
     NSString *testDir = [docPath stringByAppendingPathComponent:@ "test" ];
     [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
     if  ([fileManager fileExistsAtPath:testDir]) {
         NSLog(@ "It is exist" );
     }
     // 获取默认问价或者某个文件夹的大小
     NSDictionary *dic = [fileManager attributesOfItemAtPath:docPath error:nil];
     NSLog(@ "dic: %@" , dic);
     NSNumber *number = [dic objectForKey:NSFileSize];
     NSLog(@ "number: %@" , number);
     
}
 
 
// 文件移动
- ( void )fileMove
{
#pragma mark - 文件移动
     // 创建文件夹
     NSString *docPath1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
     NSString *dirPath = [docPath1 stringByAppendingPathComponent:@ "path" ];
     NSFileManager *fileManager1 = [NSFileManager defaultManager];
     [fileManager1 createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
     
     // 创建文件
     NSString *filePath = [dirPath stringByAppendingPathComponent:@ "test1.txt" ];
     [fileManager1 createFileAtPath:filePath contents:nil attributes:nil];
     
     // 将图片对象存入到该文件中
     UIImage *image1 = [UIImage imageNamed:@ "640*960.jpg" ];
     NSData *data1 = UIImageJPEGRepresentation(image1, 1.0);
     [data1 writeToFile:filePath atomically:YES];
     NSLog(@ "%@" , filePath);
     
     // 移动文件
     NSString *desPath = [docPath1 stringByAppendingPathComponent:@ "test1.txt" ];
     [fileManager1 moveItemAtPath:filePath toPath:desPath error:nil];
}
 
 
// 文件更改
- ( void )changeFile
{
     // 1.获取Documents路径
     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     // 2.创建文件路径
     NSString *filePath = [docPath stringByAppendingPathComponent:@ "text.txt" ];
     // 3.使用文件管理对象创建文件
     NSFileManager *fileManager = [NSFileManager defaultManager];
     [fileManager createFileAtPath:filePath contents:[@ "abcdefg"  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
     // 4.创建文件对接对象
     NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath]; // 文件对象此时针对文件,可读可写
     // 5.将偏移量移动到3的位置
     [handle seekToFileOffset:3];
     // 6.写入数据
     [handle writeData:[@ "1234"  dataUsingEncoding:NSUTF8StringEncoding]];
     // 7.执行完操作后,关闭文件
     [handle closeFile];
     
     NSLog(@ "%@" , filePath);
}

目录
相关文章
|
存储
13-iOS消息转发机制以及常用场景
13-iOS消息转发机制以及常用场景
100 0
|
2月前
|
存储 安全 Android开发
探索Android与iOS的隐私保护机制
在数字化时代,移动设备已成为我们生活的一部分,而隐私安全是用户最为关注的问题之一。本文将深入探讨Android和iOS两大主流操作系统在隐私保护方面的策略和实现方式,分析它们各自的优势和不足,以及如何更好地保护用户的隐私。
|
2月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
2月前
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
2月前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
3月前
|
存储 安全 数据安全/隐私保护
探索安卓与iOS的隐私保护机制####
【10月更文挑战第15天】 本文深入剖析了安卓和iOS两大操作系统在隐私保护方面的策略与技术实现,旨在揭示两者如何通过不同的技术手段来保障用户数据的安全与隐私。文章将逐一探讨各自的隐私控制功能、加密措施以及用户权限管理,为读者提供一个全面而深入的理解。 ####
114 1
|
6月前
|
调度 Swift Android开发
苹果iOS新手开发之Swift中的并发任务和消息机制
Swift的消息机制类似Android的Handler,实现任务调度有三种方式: 1. **Grand Central Dispatch (GCD)**:使用`DispatchQueue`在主线程或后台线程执行任务。 2. **OperationQueue**:提供高级接口管理`Operation`对象。 3. **RunLoop**:处理事件如输入源、计时器,类似Android的`Looper`和`Handler`。 **示例**: - GCD:在不同线程执行代码块。 - OperationQueue:创建操作并执行。 - RunLoop:用Timer添加到RunLoop中。
113 2
|
7月前
|
安全 算法 数据安全/隐私保护
探索iOS与Android的隐私保护机制
【6月更文挑战第5天】在数字时代,隐私保护已成为用户最关心的问题之一。iOS和Android作为两大主流操作系统,各自发展出了独特的隐私保护技术。本文将深入探讨这两个平台在隐私保护方面的策略、技术和挑战。
182 3
|
API iOS开发
iOS 沙盒机制
iOS 沙盒机制
160 0
|
iOS开发
iOS开发 - 通过代码获取沙盒启动图片
iOS开发 - 通过代码获取沙盒启动图片
174 0