iOS应用沙盒存储

标签(空格分隔): iOS沙盒 iOS数据库 iOS归档


说到iOS持久化技术,务必先看一下苹果官方的iOS Data Storage Guidelines,苹果对iOS各种不同的应用数据存储目录做了详细规定,有英文阅读能力的建议去阅读原文。英文不好的,就看我的翻译吧,虽然可能不是很准确,这也是我建议去阅读原文的原因。 以下为译文:

为了保证尽可能高效地备份数据,请按照以下标准来存储你的应用数据:

1.只有用户使用生成的文档、其他数据或者是应用程序无法重新创建的数据才应该保存在< Application_Home >/Documents目录下,这些数据会自动备份到iCloud;

2.可以重新下载或生成的数据应该存储在< Application_Home >/Library/Caches文件夹下。比如你应该把作为缓存的数据库文件、下载的内容保存在/Library/Caches文件夹下,杂志、报纸和地图使用的数据就属于这一类。

3.只是暂时使用的数据应该存储在< Application_Home > / tmp目录中。当你使用完这些数据,要记得删除,虽然它们没有备份到iCloud,这样才不会继续占用用户设备的存储空间。

4.使用"do not back up"属性来指定需要保留在设备中的文件,即使在存储空间所剩无几的情况下。那些能够重新生成但在存储空间所剩无几时仍需要保留,对应用程序的正常运行有影响,或用户希望在离线时仍可用的文件就用这个属性。所有文件都可以使用这个属性,不论在哪个文件夹下,包括Documents目录。这些文件不会被清理掉,也不会被添加进iTunes或iCound的备份中。这些文件会一直占用着用户设备的存储空间,你的应用要负责监控和定期清理这些文件。

##一、应用沙盒

沙盒目录结构如图:

  • Documents 这个文件夹地下存储的是关键数据,关键数据在存储不够用时也会保留,并且会被iTunes或iCloud备份。只有用户生成的文件、应用程序不能重新创建的文件才应该保存在此目录。如果你把应用程序下载大文件,图片和视频保存在此目录,那么你的应用程序会被拒绝发布。 如果你的应用程序启用了iTunes文件分享功能,用户就可以在iTunes中看到目录内容(以及子目录),还可以更新文件。

启用分享功能方法:为Info.plist文件添加键值:"Application supports iTunes file sharing","YES"

  • Library 用来存储不想共享给用户的文件。需要时你可以创建自己的子目录。

Library/Caches 这个文件夹存储的是缓存数据,iTunes和iClou不会备份这些数据。缓存数据是可以重新生成或下载的数据 Library/Preferences 用于存储应用程序偏好设置的plist文件,

  • tmp 供应用程序存储临时文件。iTunes和iCloud不会备份该目录,系统可能会清空该目录下的数据(重新启动就会清理),在不需要这些文件时,应用程序要及时删除tmp中的文件,以免占用文件系统的空间。
#pragma mark - 获取沙盒Documents的文件目录
+ (NSString *)getDocumentsDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES) lastObject];
}
#pragma mark - 获取沙盒Library的文件目录
+ (NSString *)getLibraryDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, 
NSUserDomainMask, YES) lastObject];
}

#pragma mark - 获取沙盒Caches的文件目录
+ (NSString *)getCachesDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
NSUserDomainMask, YES) lastObject];
}

#pragma mark - 获取沙盒Preference的文件目录
+ (NSString *)getPreferencePanesDirectery{
    return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory,
 NSUserDomainMask, YES) lastObject];

}

#pragma mark - 获取沙盒tmp的文件目录
+ (NSString *)getTmpDirectory{
    return NSTemporaryDirectory();
}
#pragma mark - 得到指定目录下的所有文件
+ (double)sizeWithFilePath:(NSString *)filePath{
    //1.获得文件管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    
    //2.检测路径是否合理
    BOOL dir = NO;
    if (![manager fileExistsAtPath:filePath isDirectory:&dir]) {
        return 0;
    };
   
    if (dir) {//如果是文件夹就要遍历该目录下的所有文件
        NSArray *subpaths = [manager subpathsAtPath:filePath];
        int totalSize = 0;
        for (NSString *subPath in subpaths) {
            NSString *fullsubpath = [filePath stringByAppendingPathComponent:subPath];
            BOOL dir = NO;
            [manager fileExistsAtPath:fullsubpath isDirectory:&dir];
            if(!dir){//如果子路径是个文件
                NSDictionary *attrs = [manager attributesOfItemAtPath:fullsubpath error:nil];
                totalSize +=[attrs[NSFileSize] intValue];
            }
        }
        return totalSize/(1024*1024.0);
    }else{
        NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:nil];
        return [attrs[NSFileSize] intValue] / (1024*1024.0);
    }
    
}
#pragma mark - 得到指定目录下的所有文件
+ (NSArray *)getAllFileNames:(NSString *)directoryPath{
    return [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:directoryPath error:nil];
}
#pragma mark - 删除指定目录或者文件
+ (BOOL)clearFilesWithFilePath:(NSString *)path{
    return [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

}
#pragma mark - 清空指定目录下文件
+ (BOOL)clearFilesFromDirectoryPath:(NSString *)directoryPath{
    NSArray *fileArray = [self getAllFileNames:directoryPath];
    BOOL isDeleteFilesSucess = NO;
    for (NSString *fileName in fileArray) {
        NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName];
        isDeleteFilesSucess = [self clearFilesWithFilePath:filePath];
        if (!isDeleteFilesSucess) {
            break;
        }
    }
    return isDeleteFilesSucess;
}
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值