Application Bundles
: Application Bundle은 앱이 실행되기 위한 모든 데이터들을 담고 있는 bundle이라고 보면 된다. 상세 구조는 개발하는 Platform에 따라 달라질 수 있지만 사용하는 방법은 똑같다.

What Files Go Into an Application Bundle?
1) Info.Plist(필수) 
-  앱의 설정 파일이라고 보면 된다.
2) Executable(필수)
- 앱은 반드시 이 파일을 포함해야 한다. 이 파일은 앱의 main entry point와 app target으로 링크된 code가 포함되어 있다.
3) Resource files
- 이 파일은 executable file 바깥에 있다. 대표적으로 image, icon, sound, nib file, string file, configuration file, data file등이 포함된다. 대부분의 resource file들은 사용언어, 지역에 따라 localized될 수 있다. 
- Resource는 localized가 필요한것과 그렇지 않은것으로 나뉠수 있는데, localized가 필요한것을 app 번들 root에 각자 subdirectory들이 존재하고 그 subdirectory안에 똑같은 파일들과 똑같은 이름을 가진 파일들이 각각 들어가 있다. app이 localized resource를 찾을때는 language preference를 참조해서 해당 폴더를 결정한다.
4) Other support files
- custom data resource를 Application bundle에 포함 시킬 수 있다. 하지만 custom framework나 plug-in은 포함하지 못한다.

Anatomy of an iOS Application Bundle
The iOS Application bundle Structure
: 전형적인 iOS Application Bundle은 App이 사용하는 Executable과 resource들을 bundle top directory안에 포함한다.

*Bundle structure of an iOS application

- subdirectory에 있는 파일들은 localized가 필요한 파일들이다. 또한 개발자들이 필요에 의해서 추가적인 subdirectory들도 만들수 있다. 

*Contents of a typical iOS application bundle 
1) MyApp(필수)
- executable file이다. application 코드가 포함되어 있다. 파일 이름은 application name에 ".app" extension을 제외한 문자열이다.
2) Application icons(필수/권고)
- MyAppIcon.png, MySearchIcon.png, MySettingIcon.png
- 모든 icon이 필수인것은 아니지만 모두 포함하기를 권고하고 있다. SearchIcon은 앱 검색시 나오는 아이콘이고 MySettingIcon은 설정화면에서 노출되는 아이콘 이미지 이다.
3) Info.plist(필수)
- 앱 정보, 설정파일
- bundle ID, version number, display name.
4) Launch images(권고)
- 앱이 처음 켜질때 보여지는 하나 또는 그 이상의 이미지들이다.
5) MainWindow.nib(권고)
- 앱의 main nib file이다. 대표적으로, 이 파일은 app의 main window object, application delegate object를 포함한다.
- 요즘도 널리 사용중인지는 모르겠다.(본적이 없음..)
6) Setting.bundle
- plug-in의 특별한 타입이라고 보면 된다. 설정 앱에 추가하고 싶은 컨텐츠를 설정하고 싶을 때 사용한다. 
- property list, other resource file들을 포함한다.
7) Custom resource files
- nib file, image, sound files, configuration files, string files, any other custom data files.
- Non-localized resource들은 top level directory에 위치하고, localized resource들은 language-specific subdirectory 안에 위치한다.

* iOS app bundle은 "Resources"라는 이름의 custom folder를 포함하지 못한다.



Framework Bundles
: Framework는 dynamic shared library와 resource file을 포함하는 directory구조다.
Framework는 dynamic shared library가 가지는 장점을 그대로 가진다. 즉, 여러 application에서 같은 dynamic shared library를 사용하면 메모리에는 하나의 library만 올라간다. 모든 application에서 같은 library라 할지라도 각각의 library와 resource file을 중복으로 가지고 있거나 사용하는 비효율을 막기 위함이다. 
동작 방식은 build 타임에는 shared library를 링킹만 시켜주고 application이 실제 로드 될때 dynamic loader가 링크된 shared library를 참조해서 이미 로딩되어 있으면 기존것을 사용하고 로딩되어 있지 않으면 shared library를 로드해서 사용하는 방식이다.

* 오직 code와 read only resource들만 공유한다. writable resource들은 각자 application이 copy해서 사용한다.

Anatomy of a Framework Bundle
: Framework는 dynamic shared library를 포함하기 때문에 다른 앱이 같은 framework를 쓰지만 framework의 version이 서로 다를 경우가 있다. 이를 위해서 Framework의 구조는 multiple version을 지원하는 versioned bundle구조로 되어 있다. 
즉, multiple version의 code와 resource들을 포함할 수 있다. 필요에 따라서 하위 버전을 사용하는 앱이 최신버전의 framework를 사용하도록 업데이트 되는것도 허용된다.

아래는 framework의 구조이고, symbolic link가 어떤식으로 되어있는지 보여준다.






Localized Resources in Bundles
: localized subdirectory의 이름은 'language_region.lproj'의 규칙을 따라야 한다.
language 부분은 두글자를 써서 구분한다.(ISO 639 convention을 따름.) 
region 부분 역시 두글자를 써서 구분한다.(ISO 3166 convention을 따름.) region을 명시하는 것은 optional 이지만 지역별로 다르게 대응해줘야 할 경우 유용하게 사용된다.
예를들어 'en.lproj'로 영어 국가는 모두 대응할 수 있다. 하지만 'en_GB.lproj', 'en_AU.lproj', 'en_US.lproj'를 통해 영국, 호주, 미국을 따로 대응할 수 있다.

*NSBundle, CFNundleRef는 이전버전과의 호환성을 위해 human-readable directory names응 지원한다. English.lproj, japanese.lproj 등등.. 
하지만 ISO convention을 따르는 것을 추천한다.

loader는 정해진 순서대로 해당 폴더를 참조하여 resource를 가져온다. 처음에는 언어+지역에 해당하는 폴더에서 resource를 찾고 그곳에 없으면 언어에 해당하는 폴더에서 찾고 그곳마저 없으면 non-localized resource들 중에 찾는다. 즉, 모든 localized subdirectory안에 resource 파일을 폴더마다 중복으로 가지고 있을 필요가 없다.




이와같이 언어_지역 subdirectory는 localized resource를 full set으로 가지고 있을 필요가 없다. 없는 resource는 언어 subdirectory에도 찾을 것이기 때문이다. 하지만 언어 subdirectory는 localized resource를 full set으로 가지고 있어야 한다.

*Resource 폴더는 무시해라.(Mac app에만 존재하는 구조이다. iOS는 App bundle root라고 생각하면 된다.)






'IOS > 공통' 카테고리의 다른 글

Extension  (0) 2017.08.31
Event Handling Guide - Responders  (0) 2017.05.03
Event Handling Guide - Gesture  (0) 2017.04.07
Objective-C, Swift 기초  (0) 2017.03.26
Cocoa Pods  (0) 2017.02.19
Posted by 홍성곤
,