iOS应用文件夹
IOS5多了一个比较重要的功能iCloud,但是同时也出现一个问题,很多的APP都把很大量的数据存在APP底下的Documents(/Documents )文件夹里面,这样苹果会reject掉你的APP的,除非你不再更新就一直把APP摆在APPStore,显然这样是不可行的,因为你这些文件会同步到iCloud上面的。
这里有办法不让苹果reject你的APP,一个就是把这些文件存在Caches(/Library/Caches)文件夹里面,但是这个苹果说了,如果在低存储空间的时候会清理的,所以你有可能就这样被清了这些数据,会导致一些列的问题,如果你不在意这些文件是否会被删除,或者这些数据只要保存那么几天,那么这样就行了
如果你要文件不删除但是也不备份,可以使用下面代码来做标记,不做备份处理
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
#import <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSString*) path
{
if (SYSTEM_VERSION_LESS_THAN(@"5.1"))
{
constchar* folderPath = [pathfileSystemRepresentation];
const char* attrName ="com.apple.MobileBackup";
u_int8_t attrValue = ;
intresult = setxattr(folderPath, attrName,&attrValue,sizeof(attrValue),,);
return result == ;
}
else
{
#ifndef __IPHONE_5_1
#define NSURLIsExcludedFromBackupKey @"NSURLIsExcludedFromBackupKey"
#endif
NSError *error = nil;
NSURL* url = [NSURLfileURLWithPath:path];
BOOLsuccess = [url setResourceValue:[NSNumbernumberWithBool:YES]
forKey:NSURLIsExcludedFromBackupKey
error: &error];
return success;
}
}
iOS应用在运行时经常要创建一些文件,不过这些文件要如何存放呢?有没有什么要求呢?
由于手机资源空间有限而且考虑到Apple推出的iCloud,我们确实要对创建出的文件按照作用的不同,分出几种类别出来,并设置文件备份属性attribute(需iOS5.0.1及以上),从而让iOS系统更好地管理和对待我们所创建的文件。
iOS的文件分类、存放路径及文件属性
iOS Data Storage Guidelines 和 “do not back up”文件属性
iOS
5有了iCloud后,Apple更新了数据存储指导方针,以适应于iCloud存储,同时增加了“不要备份”文件属性,可以指定文件不备份和上传到iCloud
摘录如下,供大家参考:
iOS 数据存储指导方针
iCloud包括了备份,会通过Wi-Fi每天自动备份用户iOS设备。app的home目录下的所有东西都会被备份,除了应用Bundle本身、缓存目录和temp目录。已购买的音乐、应用、书籍、Camera
Roll、设备设置、主屏幕、App组织、消息、铃声也都会被备份。由于备份通过无线进行,并且为每个用户存储在iCloud中,应用需最小化自己存储的数据数量。大文件会延长备份时间,并且消耗用户的可用iCloud空间。
为了确保备份尽可能快速高效,应用存储数据需要遵循以下指导方针:
1.
只有那些用户生成的文档或其它数据,或者应用不能重新创建的数据,才应该存储在/Documents目录下,并且会被自动备份到iCloud。
2.
可以重新下载或生成的数据,应该存储在/Library/Caches目录。例如数据库缓存文件、可下载文件(杂志、报纸、地图应用使用的数据)等都属于这一类。
3.
临时使用的数据应该存放在/tmp目录。尽管这些文件不会被iCloud备份,应用在使用完之后需要记得删除这些文件,这样才不会继续占用用户设备的空间。
4.
使用”不要备份”属性来指定那些需要保留在设备中的文件(即使是低存储空间情况下)。那些能够重新生成,但在低存储空间时仍需保留,对应用正常运行有影
响,或者用户希望文件在离线时可用的文件,需要使用这个属性。无论哪个目录下的文件(包括Documents目录),都可以使用这个属性。这些文件不会被
删除,也不会包含在用户的iCloud或iTunes备份中。由于这些文件一直占用着用户设备的存储空间,应用有责任定期监控和删除这些文件。
iOS 5.0.1开始支持”do not back
up”文件属性,允许开发者明确地指定哪些文件应该被备份,哪些是本地缓存可以自动删除,哪些文件不需要备份但不能删除。此外,对目录设置这个属性,会阻止备份该目录和目录中的所有内容。
注意”do not back up”属性只能用于iOS
5.0.1以后版本。之前版本的应用需要存储数据到/Library/Caches目录才能避免被备份。由于老的系统忽略这个属性,你需要确保应用在所有iOS版本中,都遵循上面的iOS
Data Storage Guidelines。
关键数据
内容:用户创建的数据文件,无法在删除后自动重新创建,且会
路径:主目录/Documents
属性:不要设置"不备份"
管理:iOS系统即时遇到存储空间不足的情况下,也不会清除,同时会备份到iTunes或iCloud中
缓存数据
内容:可用于离线环境,可被重复下载重复生成,即时在离线时缺失,应用本身也可以正常运行
路径:主目录/Library/Caches
属性:默认
管理:在存储空间不足的情况下,会清空, 并且不会被自动备份到iTunes和iCloud中
读取Cache目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
临时数据
内容:应用运行时,为完成某个内部操作临时生成的文件
路径:主目录/tmp
属性:默认
管理:随时可能被iOS系统清除,且不会自动备份到iTunes和iCloud,尽管 iCloud 不会备份这些文件,但在应用在使用完这些数据之后要注意随时删除,避免占用用户设备的空间
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
离线数据
内容:与缓存数据类似,可以被重新下载和重建,但是用户往往希望在离线时数据依然能够托托地存在着
目录:主目录/Documents 或 主目录/Library/自定义的文件夹
属性:放于Documents下不需设置,放在自定义文件夹中需设置"不备份"
管理:与关键数据类似,即时在存储空间不足的情况下也不会清楚,应用自己应该清除已经不再使用的文件,以免浪费用户设备空间
项目自带的.bundle资源束
项目自带的资源存放在.bundle中这些资源只读不能写
NSString *defaultDBPath = [[NSBundlemainBundle] resourcePath];
读取Library目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
iOS应用文件夹的更多相关文章
- IOS 创建目录/文件夹
•IOS 应用目录简介 个文件夹:Documents, Library和 tmp.Library包含Caches.Preferences目录. Documents:应用中用户数据可以放在这里,iTun ...
- iOS开发文件夹--Copy items if needed
蓝色文件夹 蓝色文件夹(folder)一般作为资源文件夹使用,与黄色文件夹的主要区别是不参与编译,所以说如果你在这些文件夹下编写的逻辑代码是不参与编译的,其他文件也不能直接引用它们,若引用其中文件需要 ...
- iOS --创建文件夹 ,删除文件夹
//创建文件夹 --> 返回 文件夹 - (NSString *)pathToPatientPhotoFolder { NSString *documentsDirectory = [NSSea ...
- ios App 文件夹
转:http://stackoverflow.com/questions/16561779/nssearchpathfordirectoriesindomains-nsuserdomainmask D ...
- IOS之文件夹创建、删除,图片在本地的保存和加载
本文转自http://blog.csdn.net/toddmi/article/details/8204102 = (NSCachesDirectory, NSUserDomainMask, YES) ...
- iOS 项目的文件夹结构能看出你的开发经验
近期有师弟去面试iOS开发,他谈论到,面试官既然问他怎么分文件夹结构的,并且还详细问到每一个子文件夹的文件名称. 文件夹结构确实非常重要.面试官问他这些无疑是想窥探他的开发经验.清晰的文件夹结构,可让 ...
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- [iOS翻译]《iOS 7 Programming Cookbook》:iOS文件与文件夹管理(下)
三. 创建文件夹 问题: 你想创建文件夹到磁盘,存储一些文件到里面 解决方案: 使NSFileManager类的实例方法createDirectoryAtPath:withIntermediateDi ...
- [iOS翻译]《iOS 7 Programming Cookbook》:iOS文件与文件夹管理(上)
简介: iOS基于OS X,而OSX本身基于Unix操作系统.在iOS里面,操作系统的完全路径结构是不可见的,因为每个APP的数据都存储自身的沙盒里面.沙盒环境实际上听起来像这样:一个只允许当前APP ...
随机推荐
- greenDao:操作数据库的开源框架
greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...
- iOS开发小技巧--iOS程序进入后台运行的实现
iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...
- session过期返回登录页面跳出frame
session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session ...
- 使用 antd Table组件, 异步获取数据
使用React.js + Redux + antd 制作CMS 后台内容管理系统,分享一点点积累,欢迎讨论. 在this.state中初始化数据: this.state = { pageNum:1, ...
- Servlet和JSP学习指导与实践(一):Servlet API初探
前言: JavaSE如何跨度到JavaEE?原本java语言只是专门用于application桌面小应用程序的开发,但自从其追随CGI进入服务器端的开发之后便一发不可收拾.先是Servlet1.0,再 ...
- java高新技术-基本数据类型拆装箱及享元设计模式
享元设计模式 public static void main(String[] args) { Integer iObj = 3; //自动装箱 System.out.println(iObj + 1 ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- 下载imagenet2012数据集
摸索了一下,imagenet2012下载,跟大家分享一下 用迅雷会员加速都可以下载,有的用百度云也可以离线下载 http://www.image-net.org/challenges/LSVRC/20 ...
- Java基础-重写System.out.println方法
PrintStream myStream = new PrintStream(System.out) { @Override public void println(String x) { super ...
- CentOS 7 上安装 redis3.2.3安装与配置
前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自身集群的功能. 而现在最新的项目是需要redis集群的,这篇文章我们就来介绍下有关redis的安装与配置. 一. ...