| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- displayscale
- IOS
- mangle
- updatecycle
- modulararchitecture
- ciimage
- uicollectionview
- 이진삽입정렬
- XCUITest
- swift6.1
- 다이나믹링크분석
- mainrunloop
- 뷰를그리는메서드
- xcrun swift-demangle
- UIKit
- cgimage
- SPM
- swift-demangle
- swift6
- ios바이너리분석
- Swift
- applaucnchprocess
- actor
- 뷰의레이아웃을계산하는메서드
- swiftconcurrency
- task
- Architecture
- mach-o파일분석
- WWDC24
- Xcode
- Today
- Total
꾸준한 기록
FileSystem, FileManager 본문
업무를 하면서 FileSystem을 다룰 일이 많아져서, 블로그에도 정리해서 포스팅해보려 합니다.
iOS FileSystem과 관련된 공식 문서에 따르면, 애플은 유저의 정보를 보호하기 위해 앱의 샌드박스 내부에 존재하는 파일만 접근할 수 있도록 제한하고 있습니다. 그리고 앱에서 FileSystem에 쉽게 접근할 수 있도록 FileManager라는 인터페이스를 제공합니다.

샌드박스 디렉토리는 크게 2가지 영역으로 나뉘어집니다.
1) Bundle Container 디렉토리: 앱의 Bundle에 해당
2) Data Container 디렉토리: 앱을 운영하기 위한 데이터 저장, 사용하는 용도에 따라서 하위 디렉토리가 다시 존재
오늘 제가 중점적으로 살펴볼 부분은 Data Container의 하위 디렉토리이며, 이들은 다음과 같은 특징을 갖고 있습니다.
Data Container 구성
1) Documents
- 유저가 생성한 컨텐츠를 저장하는 곳
- File 앱을 통해서 Documents 디렉토리에 저장된 파일을 볼 수 있음
- 하위 디렉토리로 Inbox 존재: 외부 앱에게 공유할 파일을 담는 곳
- ex) 유저가 다운로드한 문서, 유저가 작성한 문서, 유저가 그린 그림 파일,
- iTunes와 iCloud로 백업된다.
2) Library
- 유저에게 노출되면 안되는 데이터를 지정
- 하위 디렉토리로 Application Support와 Cache 존재
- 앱을 운영하는데 필요한 데이터를 Application Support에 저장, 캐싱 파일을 Cache에 저장
- ex) 로컬 db 데이터
- Cache 디렉터리를 제외하고 나머지는 iTunes와 iCloud로 백업된다.
3) tmp
- 임시 저장 공간에 해당
- 시스템에서 저장공간 마련 위해 tmp 디렉토리내 데이터 제거 가능
- iTunes와 iCloud로 백업 안됨
let libraryURLs = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)
let libraryURL = try? FileManager.default.url(for: .libraryDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
FileSystem을 이용해 위 디렉터리의 url을 얻어올 수 있습니다.
1) Documents
let docURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let docURLs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
for 파라미터로 어떤 디렉토리의 url을 찾고 싶은지를 지정하고, FileManager는 in 파라미터로 지정된 도메인 범위에서 해당 디렉토리의 탐색을 시작합니다.
예시에서 첫번째 줄의 url 메서드는 FileManager가 발견한 가장 첫번째 Document 디렉터리를 반환하며, 두번째 줄의 urls 메서드는 탐색한 document 디렉토리를 전부 반환합니다.
2) Library
- Library
let libraryURLs = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)
let libraryURL = try? FileManager.default.url(for: .libraryDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
- Libarary/ApplicationSupport
let supportURLs = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
let supportURL = try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
- Library/Cache
let cacheURLs = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
let cacheURL = try? FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
3) tmp
let tmpURL = FileManager.default.temporaryDirectory
domain mask
FileManager.default.url 메서드에서 두번째 파라미터인 in에 들어가는 값이 domain mask에 해당합니다.
앞서서 언급했듯이 FileManager가 url을 찾기 위해 들여다보는 범위에 해당하는데요.
총 4개의 값이 존재합니다.

공식문서 설명이 Mac OS 기준으로 되어있어서 이를 iOS 기준으로 바꿔보자면, userDomainMask가 앱의 샌드박스 범위에 해당합니다.
따라서 iOS 앱 개발을 하면서 가장 자주 사용하는 것도 userDomainMask입니다.
networkMask 는 네트워크 통신에서 이용되는 파일들이 저장되는 Network 디렉토리부터 하위디렉토리로 탐색을 시작합니다.
systemDomain는 애플에서 제공하는 시스템 파일들을 저장하는 System 디렉토리부터 탐색을 시작하며, allDomainMask는 루트 디렉토리부터 탐색을 시작합니다.
'iOS' 카테고리의 다른 글
| iOS 시스템의 메모리 구조 (0) | 2024.08.31 |
|---|---|
| [WWDC24] Bring you app's core features to with App Intents 요약 (0) | 2024.06.20 |
| Application State (1) | 2024.05.01 |
| [SwiftUI] 기초 (App, Scene) (2) | 2023.11.27 |
| [iOS] URL Loading System (0) | 2022.08.11 |