iOS 파일시스템은 SandBox 구조를 띄고있다.
Sanbox: 아이들에게 놀이터 모래사장 안에서만 돌 수 있도록하고, 나올 때는 흙을 털고 나오게하는 것처럼, 내부와 외부를 적절하게 분리시키는 구조라고 할 수 있다. iOS는 기본적으로 앱마다 별도의 파일을 생성하여 공유 되지 않도록 하고 외부러부터 들어온 접근에 대해 보호되는 영역으로 시스템이 부정적으로 조작되는 것을 막는 보안형태를 띄고있다.
SandBox 구조의 예
- A앱에서 문서를 작성하면 B앱에서 열 수 없다. A앱에서 B앱이라는 전달과정을 거쳐야만 해당 파일에 접근할 수 있다.
그렇기 때문에 옛날에는 특정 앱에서 만든 문서는 특정 앱에서만 볼 수 있었지만 지금은 Files앱을 통해 볼 수 있다.
만약 파일 시스템 구조가 SandBox구조가 아니라면 하나의 앱이 기기의 모든 자원에 접근할 수 있고, 외부로부터의 접근을 허용하게된다.
SandBox의 구조
iOS앱은 보안을 이유로SandBox 디렉토리 안에서 파일 시스템과 상호작용할 수 있도록 제한한다. 설치시, 인스톨러는 각각의 역할을 가진 컨테이너 디렉토리들을 샌드박스 디렉토리 안에 설치한다.
- Bundel Container : 앱의 번들을 담는다.
- Data Container : 앱과 유저의 데이터를 담는다. 이 데이터 컨테이너는 다시 서브디렉토리로 나뉘어 많은데이터 들을 나눠 관리한다.
- ICloud Container : 실행시에 iCloud와 관련된 것들을 담는다.
Bundle Container
(AppName).app
- 앱의 Bundle(번들) 파일이다. 이 디렉토리에 쓸 수 없으며 읽기만 가능하다.
- 변조를 막기위해 설치 시 CodeSignature를 넣는다.
- iTunes나 iCloud에 백업되지 않는다.
Bundle(번들): 실행 코드와 이미지, 사운드 같은 리소스를 한데 묶은 디렉토리이다. 코드와 리소스를 효율적으로 실행할 수 있도록 패키징하고 구성하는 방법이다. 개발자가 코드와 리소스를 패키징하고 배포하는 표준화된 방법을 제공하는 동시에 동적로딩 및 런타임 확장성을 지원한다. Xcode가 알아서 생성한다.
Data Container의 구조
앱은 보통 컨테이너 디렉토리 바깥에 접근하고 파일을 만드는 것이 금지되어있다. 특별히 유저의 전화번호부나 음악 같은 시스템 인터페이스를 이용할때는 시스템 프레임워크가 원하는 동작을 수행할 수 있게 도와준다,
Data Container
Documents
- 유저가 앱을 통해 생성한 문서나, 데이터, 또는 앱 외부에서 받은 파일을 저장한다.
- 유저에게 노출되는 파일만 저장해야한다. 내부의 파일들은 ITuns와 iCloud에 백업된다
- 유저가 수정/추가/삭제가 가능하다.
- 이 디렉토리의 파일들은 iTunes를 통해 옮길 수 있는 파일 공유 기능을 지원하는데, 이것은 Info.plist의 UIFileSharingEnable키를 YES(true)로 하면 사용 가능하다.
ex) 그림 파일이나 텍스트 파일 / 메모 / 동영상
백업이 가능하고 유저가 저장한 데이터
Documents - inbox
- Documents의 내부 inbox
- 외부 앱에서 요청하여 가져온 데이터를 inbox에 저장한다
- iCloud/iTunes에 백업된다.
- 이 디렉토리는 파일을 읽고 삭제할 수는 있지만, 새 파일을 만들거나 기존 파일을 수정할 순 없다. 편집을 위해 디렉토리 바깥으로 옮겨서 작업해야한다.
ex) 메일의 첨부파일 / 사진 편집을 위해 사진첩에서 가져온 사진
Library
- 유저 데이터가 아닌 파일들이 저장되는 가장 최 상단 디렉토리
- 사용자에게 직접노출되지 않는다
- 하위에 Application Support / Cache / Preferences 가 존재
- iCloud/iTunes에 백업된다.
Library - Application Supprot
- 사용자의 Documents를 제외한 나머지 앱의 데이터 파일을 저장하는데 사용
- 앱이 생성하고 관리하는 데이터, 설정, 리소스 등이 저장됨.
- iCloud/iTunes에 백업된다.
ex) 메모장 앱의 코어 데이터 저장소로 사용 / 앱 생성 데이터 / 채팅앱의 대화내역
카카오톡의 경우 서버에 메시지가 보존되는 기간이 3일이다. 메시지가 기기를 통해서 들어오면 기기의 로컬 데이터베이스에 저장된다. 지속적으로 관리되고 유저의 접근이 닿지 않는곳, 백업이 되는 곳은 applicaion support이다.
Library - Caches
- 앱이 쉽게 재생성할 수 있는 파일, 쉽게 다운로드 받을 수 있는 파일들이 저장됨.
- 앱의 성능을 위한 목적으로 존재하며 캐시로는 데이터베이스파일, 다운로드파일을 고려함.
- 앱이 실행중에 삭제되지 않는 것이 보장되며 백업되지 않는다.
ex) 웹 서버에서 받아온 임시 데이터
Library - Preferences
- 앱의 중요 설정들이 담김.
- NSUserDefaults 를 사용해 파일을 만들어 저장 !! <- 이거구나
tmp
- 다음 앱을 실행하는데 필요없는 임시파일들을 담는다
- 시스템은 앱이 실행중이지 않을 때 일 디렉토리를 비운다.
- iCloud/iTunes에 백업되지 않는다.
ex) 내 메모를 외부로 내보내기 위한 백업파일