iOS沙盒机制

作者: _子墨 | 来源:发表于2017-04-28 11:01 被阅读271次

一、简介

每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
应用必须待在自己的沙盒里,其他应用不能访问该沙盒

二、应用沙盒目录

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

Documents

  • 保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图
    注意点:不要保存从网络上下载的文件,否则会无法上架!

Library

  • 用户偏好,使用 NSUserDefault 直接读写!
  • 如果要想数据及时写入磁盘,还需要调用一个同步方法
  • 保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
  • 系统不会清理 cache 目录中的文件
  • 就要求程序开发时,"必须提供 cache 目录的清理解决方案"

Caches

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

Preference

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

tmp

  • 存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
  • 保存临时文件,"后续不需要使用"
  • tmp 目录中的文件,系统会自动清理
  • 重新启动手机,tmp 目录会被清空
    系统磁盘空间不足时,系统也会自动清理

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

// 沙盒根目录
    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");
    }
// 文件操作
- (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);
}

相关文章

  • iOS 系统相关复习

    沙盒 iOS沙盒详细介绍iOS沙盒篇 沙盒机制介绍 iOS中的沙盒机制是一种安全体系。为了保证系统安全,iOS每个...

  • 使用沙盒的正确姿势

    在学习iOS存储方法之前,先了解一下iOS存储机制——沙盒应用沙盒机制:每个iOS应用都有自己的应用沙盒(文件系统...

  • Objective-C沙盒结构

    导读: 一、什么是沙盒机制二、沙盒的特点三、沙盒的结构组成四、获取沙盒目录路径 一、什么是沙盒机制 iOS中的沙盒...

  • OC - 沙盒

    导读: 一、什么是沙盒机制 二、沙盒的特点 三、沙盒的结构组成 四、获取沙盒目录路径 一、什么是沙盒机制 iOS中...

  • IOS中的数据持久化之沙盒篇

    提到数据持久化 我们必须得先了解IOS程序的沙盒机制(sandBox)。 1.IOS沙盒机制介绍 iOS应用程...

  • iOS 的机制

    1、SandBox机制(沙盒机制) Sandbox 被简称为 应用程序沙盒,沙盒 或者 沙箱。在 iOS (mac...

  • iOS 开发之沙盒机制

    iOS 开发之沙盒机制

  • 05-iOS数据存储

    一、iOS沙盒机制 iOS的每个应用都有属于自己的存储空间,即沙盒应用只能访问自己的沙盒,不可访问其他区域。 沙盒...

  • iOS数据持久化(1)-文件读写

    1.沙盒机制 iOS采用沙盒机制管理应用,应用只能访问自己目录下的文件。iOS不像Android,没有SD卡概念,...

  • 数据持久化

    数据持久化 IOS沙盒机制(SandBox) IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序...

网友评论

    本文标题:iOS沙盒机制

    本文链接:https://www.haomeiwen.com/subject/mzuozttx.html