티스토리 뷰


iOS 앱을 구성하는 핵심 객체들과 iOS 메인 런루프 동작 이해

출처 : App Programming Guide for iOS

위의 문서는 이런식으로 시작한다. "당신의 앱이 Xcode에서 잘돌아간다고 AppStore에 들어갈 수 있는건 아니다." 그렇다면 어떤것들을 준수하며 앱을 만들어야하는걸까? 이제부터 차근차근 알아보자.

App들은 항상 중요한 특징들을(Key Features)를 가지고 있어야한다. 음 iOS핵심 구성요소를 말하는것 같다. 가이드에서 말하길 개인의 프로젝트 안에 있는 정보를 AppStore에 제출하기전에 확실하게 설정 및 구성해줘야한다고 한다. 하긴 그도 그렇것이 이 설정을 제대로 하지 않는 다면, 앱스토어에서 리젝되는 경우가 종종있으니 확실하게 짚고 넘어가야한다.

Expected App Behaviors, 핵심 객체들

모든 앱은 반드시 몇개의 Resource들과 Metadata를 필요로한다. iOS기기에 보여주기위한 것들을.

  • An information property-list file. 이건 Info.plist를 말한다. 이 파일은 metadata와, 시스템유저와 앱이 소통하기위해 필요한 정보를 포함한다. Xcode는 자동으로 앱의 설정과 셋팅한 정보를 Info.plist를 생성한다. 보는 방법은 프로젝트에서 Info탭을 통해 볼 수 있다.(Info.plist파일을 눌러서 보면 된다.)

  • A declaration of the app’s required capabilities. 모든앱은 반드시 하드웨어에 사용될 리소스들을 명시해야한다. (실행되기위한 요구들) 왜냐하면 앱스토에서 이 정보를 보고 사용자의 디바이스에서 사용할 수 있는 앱인지 아닌지를 판단할때 이 정보를 사용한다. 개발자는 프로젝트 Info탭에서 이걸 설정해 줄 수 있다고한다.

  • One or more icons.

  • One or more launch images. 사용자에게 나의 앱이 실행중에 있습니다를 알려주기위한 런치 이미지를 항상 적어도 하나는 꼭 넣어주어야한다.

The App Bundle

Xcode는 내가만든 App을 빌드할때 몇가지 앱에 필요한 파일들을 묶어서 관리한다. 그게바로 앱번들! 그렇다면 앱 번들엔 무엇들이 있는지 살펴보자.

  • App executable. 코드로 컴파일된 실행파일이다. .app으로 끝나며 이파일은 필수구성요소이다.

  • Info.plist 위에서 설명한 Info.plist파일.. 이파일또한 필수구성요소.

  • App icons 아이콘! 여기서의 특징은 @2x의 파일명을 가진 아이콘은 레티나 디스플레이를 위한 고해상도 아이콘이라는점!! 이것또한 필수구성요소이다.

  • Launch images 위에서 설명한 런치이미지이다. 필수구성요소.

  • Storyboard files (or nib files) 스토리보드는 앱에 포함된 뷰들과 그에 맞는 뷰컨트롤러를 포함하고있다. 또한 뷰들의 이동(segue)값을 가지고있다. 메인스토리보드는 처음에 프로젝트를 생성하면 기본적으로 제공되며, 다른 이름의 메인스토리보드를 사용하고싶다면 Info.plist에서 UIMainStoryboardFile라는 Key값을 주고 내맘대로 바꿔 줄 수 있다. 동일하게 메인스토리보드를 사용안하고, nib파일을 사용할때도 동일하게 Info.plist 에서 NSMainNibFile를 이용하여, 값을 바꾸어주면된다.<br>스토리보드는 필수는 아니지만, 추천하는 방식이다.

  • Ad hoc distribution icon 아이폰에 Ad hoc으로 앱을 설치 할때 혹은 아이튠즈에서 보여줄때 필요한 아이콘이다. 필수는 아닌 선택사항

  • Settings bundle 개발자가 커스텀한 앱의 선호도(Preferences)를 노출시키기 원하면 Setting.bundle을 포함해야한다. 선호도?가 무슨개념인지는 아직 확 와닿지는 않는 설명. Setting bundle(This bundle contains the property list data and other resource files that define your app preferences.)

  • Nonlocalized resource files 지역과 관련된 파일이다. 아이콘이라던지 소리파일, 언어등등 이러한 파일들은 bundle중에서도 중요한 파일에 속한다.

  • Subdirectories for localized resources 바로 위항목의 지역화 관련된 파일들의 서브디렉토리 리소스들이다. 특히 언어파일은 language-specific project directories에 있어야한다. 그리고 그 디렉토리는 꼭 ISO 639-1 language abbreviation plus the .lproj suffix. 규칙을 따라야한다. 예를들면 en.lproj kor.lproj 처럼말이다.

The App Life Cycle

앱의 메인 런 루프는 모든 유저가 발생하는 이벤트에 따라 처리된다. UIApplication 객체는 앱이 실행이 될때, 이벤트가 처리될때, 뷰 기반의 인터페이스에서 업데이트가 발생할때 setup된다. 이름에서 볼 수 있듯이 메인 런 루프는 앱의 메인 쓰레드를 실행한다. 이러한 것들은 앱 사용자가 발생하는 이벤트를 순차적으로 처리하기위해 사용된다.

터치가 발생했을때, UIKit의해 설정된 Port를 통해 내부의 Event queue에 이벤트를 담겨놓는다. 담겨있는 이벤트를 Main run loop에서 하나하나씩 실행된다. 그리고 실행된 결과를 결정짖는다. 대표로 예를 든 이벤트는 touch event들이고 다른 이벤트들 또한 비슷한 동작 원리로 동작된다.<br>


  • iOS apps에서의 공통 이벤트들.

    • Touch

    • Remote control & Shake motion events

    • Accelerometer & Magnetometer & Gyroscope

    • Location

    • Redraw

Execution States for Apps


  • Not running - 앱이 실행되지 않았거나, 실행중일때 하지만 시스템에 의해서 종료된상태.

  • Inactive - 앱이 foreground상태에 들어갔지만 어떠한 이벤트도 받지 않는다. 보통의 앱은 다른 앱으로 전환할떄 잠시동안 이상태에 머물게된다.

  • Active - foreground앱의 평범한 상태, 이벤트들을 받는다.

  • Background - 앱의 사용이 잠시 일시적으로 중단될때 이상태에 돌입한다. 하지만 추가적으로 실행시간이 요구되는 앱이 실행될때 이상태에 머물기도한다. 추가적으로 맵이 직접 background로 실행될땐, Inactive상태가 아니라 바로 이상태로 머문다.

  • Suspended - 백그라운드 상태지만 코드는 실행되지 않는다. 시스템은 자동적으로 앱을 이상태로 바꾼다. 이상태일때는 메모리에 앱이 남지만 어떠한 코드도 실행되지않는다. 하지만 메모리가 부족하면 알림없이 메모리공간을 차지하기위해 이상태인 앱을 메모리에서 제거한다. 그래서 오랜시간 켜지않은 앱을 다시 불러오면 처음부터 시작되는 이유이다.

앱의 상태가 변할때, delegate object에 상태에 상응하는 호출 메소드들이 있다. 이 메소드들은 개발자에게 상태가 변할때마다 적절하게 반응 할 수 있게 도와준다. (당연하지...)

  • application:willFinishLaunchingWithOptions: —This method is your app’s first chance to execute code at launch time.<br>

앱이 런칭상태일때 바로 실행된다.

  • application:didFinishLaunchingWithOptions: —This method allows you to perform any final initialization before your app is displayed to the user.<br>

앱이 보여지기 전 앱의 초기화가 필요한 부분에 초기화하는 곳이다. (한번만 실행됨.)

  • applicationDidBecomeActive: —Lets your app know that it is about to become the foreground app. Use this method for any last minute preparation.<br>

foreground상타에 돌입한다는걸 알게해준다. 앱에게 준비시간이 필요할떄 이걸사용한다? 아직모르겠다..

  • applicationWillResignActive:—Lets you know that your app is transitioning away from being the foreground app. Use this method to put your app into a quiescent state.<br>

foreground 부터 다른 앱으로 바뀔때 실행된다. 현재 사용하는 앱이 다른앱이 실행될때 요상태에 메소드가 불려진다.

  • applicationDidEnterBackground:—Lets you know that your app is now running in the background and may be suspended at any time.<br>

background에서 앱이 실행되고있을때를 알려준다.

  • applicationWillEnterForeground:—Lets you know that your app is moving out of the background and back into the foreground, but that it is not yet active.<br>

background에서 Foreground상태로 돌아왔을때, 실행된다. 하지만 아직 활성화된 상태는 아니다.

  • applicationWillTerminate:—Lets you know that your app is being terminated. This method is not called if your app is suspended.<br>

앱이 종료될때, 하지만 나의 앱이 suspended상태면 불려지지 않는다.


Comments