iyOmSd/Title: Swift

[Swift] iOS 파일구조 알아보기 Sandbox, Bundle - 파일시스템(APFS)

냄수 2020. 10. 23. 16:45
반응형

iOS의 파일시스템(APFS)은

기본적으로 앱마다 별도의 파일을 생성하고 Sandbox안에서만 접근이 가능해요

따라서 외부로부터 접근에 보호되서 조작되는것을 막는 보안형태죠

 

 

 

그렇기 때문에 옛날에는

특정 앱에서 만든 문서는 특정 앱을 통해서만 볼수 있었지만

지금은 다행이도 Files앱을 통해서 볼 수 있죠

 

Sandbox를 사용하기때문에 앱과 시스템이 상호작용이 필요할 때

시스템 접근권한을 앱이 받아오는 방식이에요

 

사용자들은 기본적으로 user domain에 속해서 대부분의 작업을 수행하게 되요

 

왼쪽: Sandbox구조    오른쪽: macOS File System

 

 

구조를 한번보려고 시뮬레이터의 폴더를 한번 탐색해봤어요

시뮬기기를 따라가면

Containers라는 폴더가 컨테이너를 구분하는거같구요

 

 

Data Container를 접근해서 보면

 

 

각 앱마다 파일이 구현된다했엇죠??

5FD8..., EE78... 등 이게 각각 앱을 나타내는 디렉토리구요

 

디렉토리에 접근하면

 

 

구조가 Document, Library, .. 보이네요

Documents를 열면 아무것도없을거에요.. 지금은 다른게 들어잇네요 ㅎㅎ

(realm을 사용했다면 여기에 기본경로가 설정되어있구요)

 

 

Library를 열면 뭐가되게 많네요

 

 

 

 

 

Bundle

디스크의 번들 디렉토리에 저장된 코드 및 리소스의 표현 이라고 정의되구요

파일 시스템내 하나의 디렉토리에요

실행가능한 파일과 plist, 필요한 리소스(이미지, string)등을 함께 가지고 있어요

읽기만 가능하고

iTunes, iCloud에 백업되지 않아요

번들에서 원하는 리소스를 꺼내 쓸 수도 있지만 번들이 아닌 다른 곳에 있는경우 파일 시스템을 이용해서 불러와야겟죠?

 

Documents

사용자가 생성한 컨텐츠를 저장할때 사용해요

이 디렉토리 내용은 파일 공유를 통해 사용자가 사용할 수 있어서 사용자에게 노출하고자 하는 파일만 포함해야해요

사용자에 의해 삭제되거나 변경 될수 있는 파일들을 저장해요

iTunes와 iCloud에 백업돼요

 

Library

사용자 데이터 파일 및 임시 파일을 제외한 모든 파일을 관리해주는곳이에요

사용자에게 노출되는 것을 피해 앱의 기능이나 관리에 필요한 파일을 저장해요

주로 Application Supprot, Caches를 이용해요

Preference, Cookies.. 등 필요할때 시스템에서 자동으로 생성해주는 디렉토리도 있어요

iTunes와 iCloud에 백업돼요

 

Library/Application Support

앱의 기능 또는 관리를위해 지속적으로 관리해야하는 파일을 저장해요

Documents와 같은 속성이고 사용자에 대한 노출여부에 따라서 위치를 결정해요

CoreData의 기본 저장 경로에요(Realm은 Documents가 기본경로)

iTunes와 iCloud에 백업돼요

 

Library/Caches

앱의 동작 속도나 데이터 절약을 위해사용하죠

다운로드 받을 수 있는 파일이어야하고

디스크공간이 부족하거나 앱 업데이트시, 등 시스템에서 자동으로 파일삭제될 수 있어요

어느 순간 삭제되어도 앱동작에 영향이 없는 파일을 저장해요

앱 실행중에는 삭제되지않아요해요

백업되지 않아요

 

Library/Caches/Snapshot

applicationDidEnterBackground 호출후 현재 뷰에대한 스냅샷을 생성하고

Background에서 Foreground로 넘어올때 이 이미지를 사용해요

 

 

상황에 맞게 파일위치를 고려해야겠죠?

 

 

파일의 URL을 가져오는 방법에는 2가지가 있어요

NSSearchPathForDirectoriesIndoMains 와 FileManager의 url()함수를 통해서 가져올 수 있어요

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

 

 

NSSearchPathForDirectoriesIndoMains는 그 경로에있는 모든 디렉토리를 검색해줘요

옵션을 통해서 /Cache, /Library, /Users등의 경로를 고를 수 있어요

반환타입은  String배열이구요!

문서에 FileManager를 이용해서 URL을 접근해라 라고 권장하고있어요

 

 

FileManager를 이용해서 가져온 결과는 위와 다를게 없어요

디렉토리에 접근한 경로를 보내주네요

반환타입은 URL이에요

 

 

domain은 directory보다 큰 개념이에요

domainMask는 존재하는 상위 URL을 숨겨주는 거에요

print(FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask))
print(FileManager.default.urls(for: .cachesDirectory, in: .localDomainMask))

 

 

파일의 경로는 같지만 보여지는 경로가 다른걸 볼 수 있어요

 

 

Bundle을 알아보려다가 Sandbox까지 가고

Sandbox를 알아보려다가 디렉토리 개념도 갑자기 쓰게되긴했는데

다 연관되어있어서 알아두면 좋을 내용일거에요

 

 

 

 

 

 

 

 

 

참고링크

developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW13

www.slideshare.net/itpersons/the-sandbox-container-directory-90246791

 

반응형