Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

iOS에서 디렉토리 경로에 따른 리소스 가져오기

스터디 목적으로 간단한 프로젝트를 만들어 보고 있는데 JavaDoc의 HTML을 파싱해 보려고 했는데 그동안은 간단한 Nib나 이미지같은 리소스들만 사용하다가 다량의 html파일을 다루려고 하다보니 어려움이 있었습니다. 무엇보다 JavaDoc의 구조는 팩키지명으로된 계층형 폴더로 되어 있고 각 폴더에는 같은 이름의 파일들이 여럿이 존재합니다.

제가 아는 범위내에서 iOS는 리소스를 이름으로 찾는 구조로 되어 있습니다. nib나 이미지 파일등을 보통 이름으로 찾는 방식을 취하고 있습니다. 대표적으로 initWithNibName: bundle: 같은 메서드들이 있습니다. 그래서 기존의 이름으로 가져오는 방식으로는 폴더경로에 따른 리소스를 가져올 수 없었고 pathForResource: ofType: inDirectory: 라는 특정디렉토리에서 리소스를 가져오는 메서드가 존재했지만  계속 nil만 리턴되었습니다.

프로젝트의 리소스 구조

예를 들어 Resources에 위와 같이 구굴의 guava의 자바독을 추가했습니다.

빌드후 타겟에 복사된 리소스 화면

하지만 위처럼 폴더구조의 리소스를 추가했다고 하더라도 Targets의 번들 리소스를 보면 위처럼 계층구조 없이 모두 들어가 있는 것을 볼 수 있습니다. 이렇기 때문에 폴더구조로 넣어고 계층형구조로 찾을수가 없고 유일한 이름으로 찾아야 합니다.

리소스의 동일한 파일명때문에 컴파일 경고가 뜬 화면

한곳에 모두 복사되기 때문에 컴파일을 하게 되면 위와 같이 Multiple build commands for out file 오류가 엄청나게 나오게 됩니다. 이것은 리소스를 번들에 복사를 하는데 계층형이 없이 파일만 복사를 하게 되므로 동일한 파일이 겹치게 되서 중복경고가 발생하는 것입니다.

그룹이 아닌 폴더로 복사하는 화면

이 문제를 해결하려면 리소스를 프로젝트에 복사할때 일반적으로 선택하는 Recursibely create groups for any added folders대신에 Create Folder References for any added folders를 선택해서 추가해 주어야 합니다.

사용자 삽입 이미지

이렇게 추가를 하게 되면 위 화면처럼 기존의 리소스가 그룹을 의미하는 노란색으로 표시된 데 반해 폴더는 파란색 폴더로 표시되게 됩니다. 그리고 Targets에도 번들 리소스에 폴더의 계층이 그대로 복사된 것을 볼 수 있습니다. 이제 pathForResource: ofType: inDirectory:를 사용해서 원하는 리소스를 찾을 Resources이하의 디렉토리경로를 지정해 주면 경로에 따른 파일을 가져올 수 있습니다.
2011/05/17 03:30 2011/05/17 03:30