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

相關文章
相關標籤/搜索