iOS11文件存储最佳实践

众所周知,iOS11以前的版本咱们没法看到应用里边的任何文件,这主要是因为iOS的沙盒机制致使的。在咱们应用的沙盒里边,有三个文件夹供咱们使用来存储文件。分别是DocumentsLibrarytmpspa

  • Documents 您应该将全部的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可经过配置实现iTunes共享文件。可被iTunes备份。
  • Library Preferences 目录:包含应用程序的偏好设置文件。您不该该直接建立偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好. Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程当中须要的信息。 可建立子文件夹。能够用来放置您但愿被备份但不但愿被用户看到的数据。该路径下的文件夹,除Caches之外,都会被iTunes备份。
  • tmp 这个目录用于存放临时文件,保存应用程序再次启动过程当中不须要的信息。该路径下的文件不会被iTunes备份。

不过因为iOS11系统中增长了一个Files的应用,致使DocumentsLibrary有些细微的变化。code

Files 是什么

Files 能够集中管理iOS上应用内建立的文件,以及各个云盘服务中保存的文件。cdn

Files使用

Files会自动整合应用内公开的全部文件,其实就是Documents文件夹中全部的文件。可是有时候咱们存储的用户的数据不想让用户看到,这时应该怎么办呢?这时候咱们能够将数据存储到ApplicationSupport文件夹。这个文件夹与Documents基本同样,除了一个能被用户看到,一个是隐藏的。blog

实践

咱们新建一个工程,而后在Info.plist中增长Application supports iTunes file sharing和Supports opening documents in place这两个选项,而且设置为YES ip

1519629565974.jpg

Application supports iTunes file sharing 能够经过iTunes操做手机上APP的Documents中的内容,实现了文件的共享ci

加上了这两个值以后,此时应用的Documents文件夹中的内容就能够经过Files应用看到了。 get

WechatIMG31.jpeg
WechatIMG32.jpeg

设置Documents或Library文件夹下的文件不被备份至iCloud

- (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;
}

复制代码

检查可用空间大小

主要用于当咱们下载某个文件到手机的时候,若是此时手机的存储空间不够用,能够先提示用户。不然不会下载,增长用户的体验博客

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:NSTemporaryDirectory()];
NSError *error = nil;
NSDictionary *results = [fileURL resourceValuesForKeys:@[NSURLVolumeAvailableCapacityForImportantUsageKey] error:&error];
if (!results) {
    NSLog(@"Error retrieving resource keys: %@\n%@", [error localizedDescription], [error userInfo]);
    abort();
}
NSLog(@"Available capacity for important usage: %@", results);

复制代码
  • NSURLVolumeAvailableCapacityKey 获取到整个手机剩余的可用空间
  • NSURLVolumeTotalCapacityKey 获取到整个手机的存储空间,好比32G的手机获取的数据时32G
  • NSURLVolumeAvailableCapacityForImportantUsageKey和NSURLVolumeAvailableCapacityForOpportunisticUsageKey 第一个获取的空间比第二个获取到的大。具体怎么计算的不知道,NSURLVolumeAvailableCapacityForImportantUsageKey与NSURLVolumeAvailableCapacityKey获取的值比较接近;NSURLVolumeAvailableCapacityForOpportunisticUsageKey获取到的值比NSURLVolumeAvailableCapacityKey小一些。做者猜测可能这几个枚举与沙河里边的文件夹相对应吧。(若是有知道具体怎么回事的能够留言哦)

个人博客

FlyOceanFishit