前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基础篇- 沙盒以及文件的操作和存取

基础篇- 沙盒以及文件的操作和存取

作者头像
進无尽
发布于 2018-09-12 10:12:37
发布于 2018-09-12 10:12:37
1.5K00
代码可运行
举报
文章被收录于专栏:進无尽的文章進无尽的文章
运行总次数:0
代码可运行

来感受下iOS app的沙盒

官方文档图片,自行感受下

沙盒机制(sandBox)

iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒,所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

  • 每个应用程序都有自己的存储空间。
  • 应用程序不能翻过自己的围墙去访问别的存储空间的内容。
  • 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

如果要访问到其他 App 的范围,必须要获取管理员许可才行,比如地理位置,相册,通讯录,话筒等。这是苹果系统的哲学,苹果认为只有把各个 App 孤立起来才能营造良好的用户体验和安全性。

通过下面的图来看一下苹果的沙盒机制吧.

通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

沙盒目录结构

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 Tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件

Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。

Library:苹果建议用来存放默认设置或其它状态信息。会被iTunes同步但是要除了Caches子目录外。

  • Library/Caches:主要是缓存文件,用户使用过程中缓存都可以保存在这 个目录中。这个目录就用于保存那些可再生的文件,可以重新下载或者重新生成的数据应该保存在目录下面。(比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹)。磁盘空间不够时 系统会删除 不会被iTunes同步。
  • Library/Preferences:应用程序的偏好设置文件。我们使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道plist中! 会被iTunes同步。

tmp:各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,也可能随着项目退出删掉。不会被iTunes同步。

iPhone在重启时,会丢弃所有的tmp文件。

沙盒文件的操作

获取程序的home目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSString *homeDirectory = NSHomeDirectory();
  NSLog(@"path:%@", homeDirectory);

获取document目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *path = [paths objectAtIndex:0];
  NSLog(@"path:%@", path);

获取Cache目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  NSString *path = [paths objectAtIndex:0];
  NSLog(@"%@", path);

获取Library目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
   NSString *path = [paths objectAtIndex:0];
  NSLog(@"%@", path);

获取Tmp目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSString *tmpDir = NSTemporaryDirectory();
  NSLog(@"%@", tmpDir);

存数据到沙盒plist文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  +(void)writeDataToPlist :(NSMutableArray *)dataArray
  {
        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *path=[paths    objectAtIndex:0];
        NSLog(@"path:%@",path);
        NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
        //写入
        NSFileManager* fm = [NSFileManager defaultManager];
        [fm createFileAtPath:filename contents:nil attributes:nil];
        [dataArray writeToFile:filename atomically:YES];
      }

沙盒plist文件读取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   +(NSArray *)getDataFormPlist{

        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *path=[paths objectAtIndex:0];
        NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
        //读文件
        NSArray* dataArray = [NSArray arrayWithContentsOfFile:filename];
        return dataArray;
  }

可以查看沙盒的应用

查看真机应用沙盒子

查看模拟器应用沙盒

文件常见操作

判断某文件是否存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSFileManager* fm=[NSFileManager defaultManager];
   if(![fm fileExistsAtPath:[self dataFilePath]]){
      //下面是对该文件进行制定路径的保存
     [fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
  }

保存某个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
可以用 NSFileManager的
  - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
  - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
  - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;

删除文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm removeItemAtPath:@"" error:&myError] == YES){
}

移动文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm moveItemAtPath:@"" toPath:@"" error:&myError] == YES){
}

拷贝文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm copyItemAtPath:@"" toPath:@"" error:&myError] == YES){
    
}

取得一个目录下得所有文件名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];

读取某个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSData *data = [fm contentsAtPath:[self dataFilePath]];
  //或者
  NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];

保存汉字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile.txt"];
NSString *content=@"更深夜静人已息";
NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];
  if ([contentData writeToFile:fileName atomically:YES]) {
    NSLog(@">>write ok.");
  }

使用工程中的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  NSString *myFilePath = [[NSBundle mainBundle] pathForResource:@"f"   ofType:@"txt"];
  NSString *myFileContent=[NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:nil];
 NSLog(@"bundel file path: %@ \nfile content:%@",myFilePath,myFileContent);

小结

后续如果有新的相关知识get,会持续更新。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.12.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【IOS开发基础系列 整理】IOS沙盒机制专题
http://blog.csdn.net/totogo2010/article/details/7669837
江中散人_Jun
2023/10/16
4290
【IOS开发基础系列 整理】IOS沙盒机制专题
编码篇-持久化NSUserDefaults
NSUserDefaults类,以字典形式保存数据,IOS会自动把字典中的键值对转换成对应的XML文件(也就是plist文件),这个文件会被保存到APP的沙盒目录中(路径为Library/Preferences/plist文件名)。
進无尽
2018/09/12
1.3K0
编码篇-持久化NSUserDefaults
ios 文件操作[通俗易懂]
iOS的沙盒机制,应用只能访问自己应用目录下的文件。iOS不像android,没有SD卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。
全栈程序员站长
2022/11/06
1.3K0
ios 文件操作[通俗易懂]
压缩视频
问题 对视频进行压缩并输出 解决方案 /// 压缩视频文件 -(void)videoCompressionWithUrl:(NSURL *)url finish:(void(^)(NSURL * fileUrl))finishCallback { NSString *docuPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES
freesan44
2020/09/21
1.8K0
iOS学习——iOS常用的存储方式
不管是在iOS还是Android开发过程中,我们都经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等。根据要存储的的数据的大小、存储性质以及存储类型,在iOS和Android中哪个都有多种存储方式。其中,iOS中的存储方式主要包括以下六类: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 手动存放沙盒 一、沙盒机制 在研究存储方式之前,我们有必要先研究下这些文件会存储到什么地方去
mukekeheart
2018/03/01
3.1K0
iOS学习——iOS常用的存储方式
iOS-网络编程(二)文件上传和断点离线下载
一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有 苹果原生(自带) NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用) NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术 第三方框架AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多 二. NSURLConnection (已弃用) 虽然NSURLConnection已经被弃用,但是我们还是要了解N
xx_Cc
2018/05/10
2.4K0
iOS数据持久化之一——plist文件 原
        iOS开发中,我们时常会将一些简单的数据进行持久化的存储,方便我们保存程序的一些配置和用户的一些数据,plist文件就是我们保存这些数据的最佳选择。
珲少
2018/08/16
1.4K0
iOS数据持久化之一——plist文件
                                                                            原
iOS文件操作的代码
NSData *condata = responseObject; //设置编码格式,这种编码格式可以正常读取中文 NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *rcontent = [[NSString alloc]initWithData:condata encoding:enc];
用户8671053
2021/10/29
4270
ios 跳转第三方App文档预览
今天有个需求,从App上下载附件可预览,产品要求简单实现就是跳转第三方App预览即可
赵哥窟
2018/09/13
7690
ios 跳转第三方App文档预览
iOS开发按时间排序文件
默认的,我们在开发中,写入沙盒里的文件按文件名排序,如0,1,2,3,4,5,a,b,c,.....z等,但有时候咱们需要将里面的文件按创建时间来排序。这时候,怎么做呢? NSFileManager中的attributesOfItemAtPath:方法可以获取沙盒内的文件信息,其中就有NSFileCreationDate和NSFileModificationDate两个属性分别代表文件创建时间和修改时间,我们可以比较两个文件的这两个属性,实现按创建时间排序或者按修改时间排序。 NSFileManage
清墨
2018/05/07
2.1K0
iOS数据持久化
// // AppDelegate.m // // import "AppDelegate.h" import "Person.h" @interface AppDelegate () @end @implementation AppDelegate (void)dealloc { [_window release]; [super dealloc]; } (BOOL)application:(UIApplication )application didFinishLaunchingWith
大师级码师
2021/10/29
5630
Foundation framework in iOS
objective-c不像CSharpe有一个标准库 他的标准有很多,想象一下近40年前的编程语言 他都经历了什么,因为早期objective-c的一套工具库是乔老头子出走时Next-step公司写的,后来回苹果之后接着维护了。bjective-c一般常用的就是 Foundation framework。这里稍微介绍一些基础工具类。点到即止 API 太多了,我也没时间花大篇幅翻译。用到哪儿就找哪儿的API。https://developer.apple.com
keyle
2024/11/01
1310
Foundation framework in iOS
Mac小工具开发问题记录
最近开发H5需要拉取多个接口拼接数据到本地,由于接口跨域问题前端无法调用。遂写一个小工具拉取接口。一直开发iOS,没怎么写过mac,记录下遇到的问题和容易忘记的地方
无忧366
2020/06/11
6880
iOS网络--『文件下载、断点下载』的实现(三):AFNetworking
本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Resume-Download-AFNetworking.html 目录 AFNetworking下载简介 AFNetworking下载相关 2.1 AFNetworking(文件下载) 2.2 AFNetworking(断点下载 | 支持离线) 关于『文件下载、断点下载』所有实现的Demo地址:Demo地址 iOS网络--『文件下载、断点下载』的实现
程序员充电站
2018/05/31
3.4K0
ALAsset和ALAssetRepresentation详解
ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件,ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小,名字,路径等详细信息。
码客说
2019/10/22
8680
IOS获得各种文档文件夹路径的方法
iphone沙箱模型的有四个目录,各自是什么,永久数据存储一般放在什么位置。得到模拟器的路径的简单方式是什么.
全栈程序员站长
2022/07/06
1.8K0
实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
ios122
2018/01/02
1.1K0
实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
将Array、Dictionary等集合类的序列化和反序列化
Objective-C的集合类序列化到文件中或者从文件中反序列化其实很简单,请看下面的示例代码:
EltonZheng
2021/01/26
4730
从网络上下载省份城市名称并存入文件然后进行读取省份城市
//实现的功能是 从后台拿到城市的省份以及名称,然后保存在本地的沙盒中 在使用的时候再拿出来用。 步骤1 //向后台请求数据 //忽略缓存 [RequestTools postJSONWithUrl:G.YB_GetZoneList parameters:@{} success:^(id responseObject) { NSError *error = nil; NSDictionary *dic = [NSJSONSerialization JSONObjec
用户1219438
2018/02/01
1K0
实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
ios122
2018/01/02
1.9K0
实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
相关推荐
【IOS开发基础系列 整理】IOS沙盒机制专题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档