• iOS는 파일을 어디에 저장하고, 왜 그렇게 하는가?

    • PC에 연결하면 앱별로 컨테이너를 확인할수 있다.
    • download Container를 클릭하면 컨테이너가 맥에 저장되고, 그 내용을 볼 수 있다.
  • 컨테이너 내부 파일들에 대한 주요질문들

    • 이 파일은 무엇인가? → 앱 기능에 관한 질문으로 개발자가 통제해야 함
    • 왜 저장했는가 → 이것도 개발자의 영역
    • 이거 백업 되어야 하나?
    • 적절한 위치인가?
  • 폴더 구조

    • iCloud Drive
      • 사용자 컨텐츠만 저장할 것 → 사용자가 인지할 수 있고, 직접 접근할 수 있기 때문에
      • 모든 디바이스에서 접근 가능
      • 로컬에 캐시됨
      • 자동으로 업로드될 수 있다.
      • 여러 디바이스에서 동시에 접근할 수 있기 때문에, 이에 대한 관리가 필요하다.
    • Document 디렉토리
      • 로컬용
      • 사용자 컨텐츠용
      • 파일 앱으로 열 수 있음
        • Open in place, file sharing 기능 제공
      • 세팅 앱에서 저장공간 관리에서 사용자가 삭제할 수도 있다.
    • Application Support 디렉토리
      • 서비스에 필요하지만, 사용자에게 보이면 안되는 파일들 → DB라던지
      • 내부적으로 계층화 가능
      • 영구적으로 저장
      • 아이클라우드나 아이튠즈 백업에 포함 됨 → 선택적으로 뺄 수 있음
      • 이 폴더의 내용은 Document & Data 로 보고됨
    • Cache 디렉토리
      • 일시적이거나 지워도 되는 컨텐츠들
      • 다운로드한 데이터들 넣기 좋은 위치
      • 백업에 포함되지 않음
      • OS가 필요하면 회수 가능
      • Document & Data로 보고되지 않음
    • Temporary
      • 앱 동작중 일시적으로 사용되는 데이터
      • 앱이 안 돌때 OS가 주기적으로 삭제
      • 백업에 미포함
      • Document & Data로 보고되지 않음
  • Best Practice

    • 백업에서 제외할 파일은 NSURLIsExcludedFromBackupKey 옵션으로 추가
    • 예전 버전에서 백업 됐을 때를 대비해야 된다.
      • 32비트 버전에서 백업된 파일을 핸들링 해야 될 수도 있다.
      • 이를 위해서 앱 버전을 라벨링해두는 게 좋다.
    • 클라우드와 로컬 중 하나만 고르는 게 좋다.
    • 데이터 저장 전, 남은 용량을 쿼리할 수 있다.
      • 이 때 중요도에 따라 옵션을 줄 수 있다.
    // volumeAvailableCapacityForImportantUsageKey: 기능적으로 필수적일 때
    // volumeAvailableCapacityForOpportunisticUsageKey: 필수적이지는 않을 때
    let fileURL = URL(fileURLWithPath:"/")
    do {
        let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])
        if let capacity = values.volumeAvailableCapacityForImportantUsage {
            print("Available capacity for important usage: \\(capacity)")
        } else {
            print("Capacity is unavailable")
        }
    } catch {
        print("Error retrieving capacity: \\(error.localizedDescription)")
    }