https://developer.apple.com/icloud/documentation/data-storage/
오늘 리젝을 하나 당했는데...사유가 '사용자가 생성한 데이터가 아닌 파일은 도큐멘트 디렉토리에 저장하면 안되용~' 이네.
당신이 사용자의 Document Directory에 2메가 이상의 파일들을 저장하고 있으니 위의 가이드를 잘 살펴보라고 한다.
iCloud가 나오면서 체크해야 할 부분이 몇 가지가 있는데, 데이터 저장과 관련한 몇 가지 부분을 수정해주어야 한다.
예전의 클라우드 서비스가 없을 시절에는 그다지 체크하지 않던 부분이었지만 글을 읽어보니 그 말도 맞다.
아무튼 수정해서 다시 올리면서 관련 사항을 한 번 정리해본다.
아이폰 개별 앱의 샌드박스 내에는 일반적으로 저장 공간이 세 부분으로 나뉘어진다.
1. 아이폰의 세 가지 저장 공간
1) Documents Directory: <Application_Home>/Documents
이 디렉토리는 마치 영구 저장소같이 사용할 수 있고, 아이클라우드 백업 시 자동으로 백업이 함께 된다.
보통은 사용자가 앱을 사용하면서 필요한 내용을 저장하거나 사용자가 생성한 데이터를 저장하게 된다.
2) Library내의 Caches Directory: <Application_Home>/Library/Caches
이 디렉토리는 사용자가 선별(아이템 구매 또는 잡지 구매 같이)적으로 저장할 수 있고, 클라우드 백업 역시 선별적으로 가능하다.
보통은 추가 구매 콘텐츠나 웹 등에서 임시적으로 이미지, 동영상, pdf 등의 파일을 저장하기도 하고 기간을 두고 해제하기도 한다.
3) tmp Directory: <Application_Home>/tmp
이 디렉토리는 일시적으로 사용하게 되는 곳으로, 클라우드 백업과는 무관한 폴더다.
잠시 보여주기 위해서 저장한 파일이나 일회성으로 소비되는 리소스를 제공한다.
그냥 끝내면 재미없으니까...유익하지도 않고, 사용법을 간략하게 적어본다.
아래의 예제는 화면 스샷을 만들어서 해당 스크린샷을 각각의 폴더에 저장해본 예제임. (파일 저장 및 읽기 부분만)
2. 활용하기
1) Documents Directory:
도큐멘트디렉토리를 지정하여 저장하려는 파일명을 패스에 추가한 뒤에 데이터를 그 지정한 패스로 저장하면 된다.
1) 쓰기
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * filePath = [documentsDirectory stringByAppendingPathComponent:@"screenshot.png"];
UIImage * image = [self screenshot];
NSData * imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:filePath atomically:NO];
2) 읽기
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:@"screenshot.png"];
NSData * imageData = [NSData dataWithContentsOfFile:path];
2) Library내의 Caches Directory:
캐쉬디렉토리를 지정하면된다. 사용법은 동일하니 참고.
1) 쓰기
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString * cachesDirectory = [paths objectAtIndex:0];
NSString * filePath = [cachesDirectory stringByAppendingPathComponent:@"screenshot.png"];
UIImage * image = [self screenshot];
NSData * imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:filePath atomically:NO];
2) 읽기
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:@"screenshot.png"];
NSData * imageData = [NSData dataWithContentsOfFile:path];
3) tmp Directory: <Application_Home>/tmp
템프 디렉토리에 사용하는 법은 조금 다르지만 아주 간단하다.
1) 쓰기
NSString * tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"screenshot.png"];
UIImage * image = [self screenshot];
NSData * imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:tempFilePath atomically:NO];
2) 읽기
NSString * tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"screenshot.png"];
NSData * imageData = [NSData dataWithContentsOfFile:tempFilePath];
아무튼 해당 내용을 잘 파악해서 목적에 맞게 저장하고 읽어야지...리젝을 안 당함...-_-;;
아참...파일이 잘 저장되었나 확인하는 방법은 시뮬레이터의 앱 안의 각각의 폴더를 확인하면 된다. 단지 템프 폴더의 경우에는 시뮬레이터 작동 시에는 해당 폴더에 저장이 안된다. 단말로 체크.