728x90
디렉토리구조에 대해 알아보겠습니다.
파일 디렉토리 구성
iOS Data Storage Guidelines
- 파일 접근 시, String대신 URL사용 권장
- 디스크에 파일을 읽고 쓰는것이 컴퓨터의 가장 느린 작업 중 하나.
- 메모리에 파일 캐싱은 항상 빠른 속도를 보장하지 않는다. 왜냐하면 메모리 사용량 증가로 또 다른 성능이 악화될 수 있고, 시스템 자체 캐시와 중복 가능성이 있기 때문입니다.
<번들 디렉토리>
- 파일 시스템 내 하나의 디렉토리
- 실행가능한 파일, info.plist, 각종 Resources(이미지, 사운드, strings등)등을 할때 그룹화
let bundlePath = Bundle.main.bundlePath
print("Path:",bundlePath, "\n")
// 출력
Path: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Bundle/Application/E3E2CDB9-47E0-4B94-BC81-F48996151668/BasicFileSystem.app
<데이터 컨테이너 홈 디렉토리>
- Data Container 홈 디렉토리 = NSHomeDirectory()
- 기본 디렉토리 = Documents, Library, temp
let homePath = NSHomeDirectory()
print("Home Directory:", homePath, "\n")
// 출력
Home Directory: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E
<데이터 컨테이터 -> 도큐먼트 폴더>
- 유저가 앱을 통해 생성한 문서나 데이터, 또는 외부 앱을 통해서 전송한 음악, pdf등의 컨텐츠를 저장하는 곳
- 유저에 의해 삭제되거나 내용이 변경되어도 무방하고 유저가 다루는 컨텐츠와 관련이 있는 파일들만 저장.
- 설정에 따라 유저가 직접 파일 추가 및 삭제 가능
-> info.plist에서 UIFileSharingEnabled = YES로 설정
let documentPath1 = NSHomeDirectory() + "/Documents"
print("DocumentPath1:", documentPath1, "\n")
let documentPath2 = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("DocumentPath2:", documentPath2, "\n")
let documentPath3 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("DocumentPath3:", documentPath3, "\n")
// 출력
DocumentPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents
DocumentPath2: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents/
DocumentPath3: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents
<데이터 컨테이터 -> 도큐먼트 폴더 -> Inbox>
- 타 앱을 통해 전송받은 파일이 저장되는 디렉토리 ex) 메일 앱 첨부파일 등
- 파일을 읽거나 삭제할 수 있지만, 새 파일을 추가하거나 기존 파일 수정 불가
- 타 앱에서 받은 파일들은 덮어쓰기 대신 [file-1, file-2]처럼 번호가 자동으로 부여되면서 새 파일이 생성
let inboxPath = NSHomeDirectory() + "/Documents" + "/Inbox"
print("InboxPath:", inboxPath, "\n")
// 출력
InboxPath: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Documents/Inbox
<데이터 컨테이터 -> 라이브러리 폴더>
- 유저 데이터 파일 및 임시 파일을 제외한 모든 파일들을 관리
- 유저에게 노출되는 것을 피하고 앱의 기능이나 관리에 필요한 파일 저장
- 주로 서브디렉토리인 Application Support와 Caches를 이용하지만 커스텀 디렉토리 사용이 가능
- Preference, Cookies, Saved Application State, WebKit등 필요할 때 시스템에서 자동 생성
// 라이브러리 폴더 경로
let libraryPath1 = NSHomeDirectory() + "/Library"
print("LibraryPath1:", libraryPath1, "\n")
let libraryPath2 = FileManager.default.urls(for: FileManager.SearchPathDirectory.libraryDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("LibraryPath2:", libraryPath2, "\n")
let libraryPath3 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("LibraryPath3:", libraryPath3, "\n")
// 출력
LibraryPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library
LibraryPath2: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/
LibraryPath3: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library
<데이터 컨테이터 -> 라이브러리 폴더 -> Application Support>
- 앱의 기능 또는 관리를 위해 지속적으로 관리해야되는 파일 저장
- Documents와 거의 동일한 속성을 가지지만, 유저에 대한 노출 여부에 따라 위치가 결정됩니다.
- 주로 BundleID나 회사명 등의 서브디렉토리로 만들어 관리
- CoreData 기본 저장 경로
- Realm은 Documents경로를 사용하는데 Documents는 노출이 되기 때문에 중요한 정보들이 저장되어있으면 Application Support폴더로 변경해서 사용하는 것이 좋다.
let applicationSupportPath1 = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("applicationSupportPath1:", applicationSupportPath1, "\n")
let applicationSupportPath2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
print("applicationSupportPath2:", applicationSupportPath2, "\n")
// 출력
applicationSupportPath1: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Application%20Support/
applicationSupportPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Application Support
<데이터 컨테이터 -> 라이브러리 폴더 -> Caches>
- 앱의 동작 속도/데이터 절약 등을 위해 사용되는 공간
- 예를 들어 Background에서 Foreground로 넘어올 때 스냅샷 이미지로 사용됨.
let cachesPath1 = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)[0]
print("cachesPath1:", cachesPath1, "\n")
let cachesPath2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print("cachesPath2:", cachesPath2, "\n")
//출력
cachesPath1: file:///Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Caches/
cachesPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8D9C6FD0-67D9-49B5-8556-BC2C4A8E043E/Library/Caches
<데이터 컨테이터 -> TemporaryDirectory>
- 현재 앱 실행중에는 사용하지만 유지할 필요 없는 임시 파일 저장
- 사용 후 필요없어진 파일은 직접 삭제해주는 것을 권장
let tempPath1 = NSHomeDirectory() + "/Temp"
print("tempPath1:", tempPath1, "\n")
let tempPath2 = NSTemporaryDirectory()
print("tempPath2:", tempPath2, "\n")
// 출력
tempPath1: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8DF81B9C-AA04-4A6A-BBCA-46B6AECA764E/Temp
tempPath2: /Users/seungjin/Library/Developer/CoreSimulator/Devices/B13138F4-0D61-4BA4-9E30-81F4B2016E08/data/Containers/Data/Application/8DF81B9C-AA04-4A6A-BBCA-46B6AECA764E/tmp/
참고 자료
'iOS' 카테고리의 다른 글
[iOS] Cell Life Cycle (1) | 2019.07.30 |
---|---|
[iOS] 코드사이닝, 인증서, 프로비저닝 프로파일이란? (1) | 2019.07.25 |
[iOS] ContentOffset과 ContentInset (0) | 2019.07.25 |
[iOS] ScrollView (0) | 2019.07.25 |
[iOS] Photos Framework (0) | 2019.07.25 |