본문 바로가기

iOS

[iOS] File System 공식문서 톺아보기 및 간단 정리

FileSystem을 사용하는 이유는 ?

  • 파일을 쉽게 검색할 수 있도록 하고 코드로 구현된 내부적인 파일접근시스템이 사용자 파일과 방해받지 않도록 하는것

sandbox에서 데이터 보호를 위해 별도의 앱전용 폴더 컨테이너를 만들어서 파일 관리를 하며 앱에게 권한을 부여하여 사용자 데이터와 상호작용하는 방식을 갖게된다. sandbox 시스템이 존재하지 않는다면 사용자 데이터에 자유롭게 접근하기때문에 이를 악용할 수도 있다. 그렇기때문에 별도의 전용 앱 디렉토리를 만들어서 데이터를 저장하는 것이고 이를 관리하는게 하고 쉽게 검색해서 파일을 접근할 수 있는게 File System이다 라고 이해함…

FileSystem Documents 문서를 해석해보자

새 App을 설치하는 동안 설치프로그램이 sandbox디렉토리내에 app용 컨테이너 디렉토리를 만든다.

File Container 디렉토리의 각각 역할은?

  • Bundle컨테이너 디렉토리는 앱의 Bundle을 보유한다.
  • Data컨테이너 디렉토리는 앱과 사용자 모두에 대한 데이터를 보유한다. 하위디렉토리가 존재하며 런타임시 하위디렉토리에 접근요청을 할 수 있다.

App은 한가지 예외 사항을 제외하고 일반적으로 외부에서 앱 내의 디렉토리에 접근하거나 파일을 만들 수 없다. 왜냐하면 외부에서 앱의 파일들이 조작되는걸 방지할 수 있기때문이다. 한가지 예외는 앱이 public시스템 인터페이스를 사용해 연락처나 음악과 같은 항목에 접근하는 경우이다.

sandbox디렉토리내에 하위 디렉토리를 알아보자!

AppNAme.app

  • 앱의 모든 자원을 포함
  • 이 디렉토리는 변조를 방지하기위해 write가 불가능하다. 이에 대한 조약을 앱설치시 서명하게되며 만일 이 디렉토리에 write하게되면 서명이변경되 app lauch가 되지않는다.
  • ITunse또는 ICloud에 의해 백업되지않는다.

Documents

  • 사용자가 생성하는 contents를 저장한다.
  • 사용자가 파일을 공유할 수 있다.
  • ITunse또는 ICloud에 백업이 가능하다

Documents/Inbox

  • 앱이 외부엔티티에서 열도록 요청한 파일에 접근한다?? 무슨말이지…
  • 앱과 관련된 이메일 첨부파일을 저장한다.

Library/

  • 사용자에게 노출시키지않으려는 파일에 사용된다.
  • 사용자 데이터파일이 아닌 파일의 최상위 디렉토리이다.
  • ITunse또는 ICloud에 백업이 가능하다

tmp/

  • 일시적으로 사용하고 버리는 파일을 저장하는 곳이다.
  • 앱이 실행되지않을때 이 파일을 제거할 수 있다.
  • ITunse또는 ICloud에 백업이 불가하다

앱의 파일을 어디에 두어야할까 ?

동기화 및 백업이 오래걸리지않도록 파일을 저장할 위치를 정해주자
대용령파일 저장시 백업을 지연시키거나 백업을 못할 수 있다. 이를 방지하지위해 가이드라인에따라 저장위치를 구별해보자

Documents/

  • 사용자관련 데이터는 여기에 저장한다.(사용자생성, 가져오기, 삭제 및 편집할 수 있는 모든 파일, 그래픽파일)
  • 비디오 및 오디오 같이 나중에 사용자가듣기위해 다운할 파일도 포함된다.

Library/Application support/

  • 앱이 실행되는데 사용하는 파일을 저장하는 곳이며 사용자에게는 숨겨져야한다.( 데이터파일, 구성파일, 템플릿 및 앱 번들에서 로드된 수정 버전이나 리소스 등)

**Documents/와 Application Support/

  • 이 디렉토리는 기본적으로 백업이된다. 주의하자.
  • NSURLIsExcludedFromBackupKey 를 사용해 백업에서 파일을 제외할 수 있습니다.
var resourceValues: URLResourceValues = URLResourceValue()
resourceValues.isExcludedFromBackup = true
	do {
		try fileUrl.setResourceVAlues(resourceValues)
	}
Swift
Copy

tmp/

  • 오래 유지할 필요없는 임시데이터를 저장하는 곳이다.
  • 사용자 기기에서 용량을 계속 먹지않도록 파일을 삭제해야하며 이 행위는 앱이 실행되고있지않을때 주기적으로 삭제한다.

Library/Caches

  • 데이터 캐시파일을 저장하는 곳이다. ( DB, 일시 contents다운로드파일)
  • 임시데이터보다 오래지속된다.
  • 앱이 Caches 작동을 요구하지않지만 이는 성능향상에 도움이된다.
  • 시스템에서 caches를 삭제할 수 있다.

The iCloud File Storage Container(Icloud파일을 저장하는 컨테이너)?

  • App의 sandbox내에 iCloud저장소가 따로 존재한다.
  • app etitlements에 나열된 보조 iCloud컨테이너 디렉토리에 접근할 수 있다.
  • 각 컨테이너 디렉토리내에는 documents와 data로 분리가 되어있으며 사용자에게 개별적으로 삭제할 수 있는 문서가 전달된다.

시스템 파일이 컨텐츠 타입을 식별하는 방법(UTls)

  • UTls는 'Type’을 가진것으로 간주되는 identity class를 고유하게 식별하는 문자열이다. 이는 파일의 확장명을 보면 알 수 있다.
  • 파일 타입을 지정하는데 UTl-기반 UI를 사용할 수 있을때는 다른 UI보다 이 UIl 기본 UI를 지향해야한다.

파일의 내용 타입을 식별하는 두가지의 기술(파일 저장하는 기술?)

  • Uniform Type Identifiers(UTls)
  • Filename extensions

UTls의 예

  • publilc.text - 텍스트 데이터를 식별하는 공용 타입이다.
  • public.jpeg - JPEG이미지를 식별하는 공용 타입이다.
  • com.apple.bundle - 번들된 앱을 식별하는 Apple타입이다.
  • com.apple.application-bundle - 번들된 앱을 식별하는 Apple타입이다.

Security: Protect the Files You Create(무결성 보호)

  • 모든 사용자데이터 및 시스템 코드는 디스크에 저장되기에 무결성 보호를 해줘야한다. 콘텐츠 도난 및 손상 방지에 대한 몇가지 방법은 여기서 자세히 확인해보자

무결성 보호란?
특정 권한을 부여하지않는한 파일 수정을 제한하는 보안시스템이다.

Sandbox Limit the Spread Of Damage(sandbox가 피해확산을 제한한다)

  • iOS 및 macOS 10.7이상에서부터 Snadbox가 App이 기록할 필요없는 파일시스템을 사용하지 못하게한다.
  • sandbox처리된 앱은 각 하나이상의 컨테이너를 사용할 수 있는데 다른 앱의 컨테이너 또는 sandbox외부의 대부분의 디렉토리에는 쓸수없다.

Accessing Files and Directories(파일 및 디렉토리에 접근하는 방법)

  • 파일을 열기전에 파일을 찾아야한다. 이 찾는 방법은 보통 참조를 얻는 방법이다. (URL 또는 문자열기반)

Choose the Right Way to Acces Files(파일에 접근하는 올바른 방법)

  • 모든 파일을 열고 내용을 byte 스트림으로 읽을 수 있지만 늘 이방법이 올바른선택은 아니다.
  • macOS 및 iOS는 다양한 유형의 표준 파일 형식(텍스트파일, 이미지, 사운드 및 속성목록)을 쉽게 여는 자원을 제공한다. 자세한내용은 여기

Specifying the Path to a File or Directory(파일 또는 디렉토리 경로 지정하는 방법?)

  • NSURL(=URL도가능) class를 사용하는 것
  • NSstrin는 Path생성과 관련된 많은 메서드를 가지고 있지만 URL은 파일과 디렉토리를 찾는 더 강력한 방법을 제공한다.
  • 네트워크 리소스와 작동하는 App은 URL의 한 타입의 객체를 사용해 local file system이나 네트워크 서버에 있는 item을 관리할 수 있음을 의미한다.
  • 대부분 URL메서드를 사용해 디렉토리및 파일이름을 연결할 URL을 작성한다. items의 계층구조를 탐색하는데 필요한 이름을 저장하기때문에 경로기반 URL(= path based URL)이라고 부른다.

user의 Documents디렉토리에 있는 MyFile.txt라는 파일에 대한 유효한 참조

path-based URL

  • file://localhost/Users/steve/Documents/MyFile.txt

File reference URL

  • file://.file/id=6546441.1256/

String=based path

  • /Users/steve/Documents/MyFile.txt
  • URL객체를 만들고 필요할때에 File reference URL로 변환한다.
  • path-based URL은 조작과 디버그하기가 쉬워 NSFileManager같은 class에서 선호한다.
  • File reference URL의 이점은 앱 실행중 path-based. URL이 유효하지않게되면 새로운 경로로 업데이트해줘야한다. 그러나 파일이 동일한 디스크의 다른위치로 이동하는 고유 ID는 변경되지않으므로 File reference URL은 유효하다

IMPORTANT
앱을 실을 실행하는 동안은 안전하게 사용할 수 있지만 재부팅시 파일 ID가 변경될 수 있어 File Reference URL은 앱 실행사이에 저장하고 다시 사용이 불가하다. 만일 파일위치를 지속적으로 저장하고 싶으면 북마크를 사용해 Locating Files Using Bookmark설명대로 북마크를 생성하면된다.

 

# 애매한 내용 질문 정리

번들과 모듈의 차이점..?

번들과 모듈이 얼핏보면 유사해보이는데

bundle은 실제 코드가 구현되어있는 파일들이 실행가능한 형태로 변형된 상태이다.

그래서 bundle내에있는 스토리보드나 관련 파일들을 클릭했을때 코드가 보여지지않고 틀적인 형태만 보여지게된다.

모듈은 내부적인 코드들의 파일들이기때문에 둘이 비슷해보이지만 성질 자체가 많이 다르다.

 

Caches 와 tmp의 차이점

캐시는 용량이 없거나 재사용이 필요하지않으면 지우지 않고 가지고 있는다.

템프는 재사용이안되고 임시적으로 사용되다가 삭제가 된다. 예를들면 앱이 종료될때 제거된다던지 ?

 

refetence