1. 앱이 시작할 때 main.c 에 있는 UIApplicationMain 함수에 의해서 생성되는 객체는 무엇인가?
UIApplication이고, 앱의 Life Cycle을 관리하게 된다. 싱글톤으로 구성되어있고, shared로 접근할 수 있다. UIWindow를 관리한다.
UIApplicationDelegate를 이용하여 다음과 같은 Action을 제어할 수 있다.
- 임시로 터치 이벤트를 일시 중지합니다 (beginIgnoringInteractionEvents()).
- 원격 알림에 등록합니다 (registerForRemoteNotifications()).
- 되돌리기-다시 실행 UI를 트리거합니다 (applicationSupportsShakeToEdit).
- URL 스키마를 처리할 설치된 앱이 있는지 확인합니다 (canOpenURL(_:)).
- 앱이 백그라운드에서 작업을 완료할 수 있도록 실행을 연장합니다 (beginBackgroundTask(expirationHandler:) 및 beginBackgroundTask(withName:expirationHandler:)).
- 로컬 알림을 예약하고 취소합니다 (scheduleLocalNotification(:) 및 cancelLocalNotification(:)).
- 원격 제어 이벤트의 수신을 조정합니다 (beginReceivingRemoteControlEvents() 및 endReceivingRemoteControlEvents()).
- 앱 수준의 상태 복원 작업을 수행합니다 (Managing state restoration task group의 메서드).
상속받아서 서브클래싱 할수는 있는데 지양해야 한다.
2. @Main에 대해서 설명하시오.
Code의 Entry Point이다. AppDelegate에 작성하게 되고, UIKit 내부에 Main함수가 숨어있다. 어느 언어나 그렇듯 Void를 반환하면 되고, throws를 충족하기만 하고, 추가적으로 static으로 구현하면 커스텀 엔트리포인트를 만들 수 있다.
3. 앱이 foreground에 있을 때와 background에 있을 때 어떤 제약사항이 있나요?
Foreground 상태에서 높은 우선순위를 가짐
Backgorund 상태에선 낮은 우선순위를 가지고, Background에서 동작하는 코드를 작성하였을경우 작업의 시작과 끝을 보장받지 못한다.
4. 상태 변화에 따라 다른 동작을 처리하기 위한 앱델리게이트 메서드들을 설명하시오.
- application(_:didFinishLaunchingWithOptions:)
- application(_:willFinishLaunchingWithOptions:)
- 앱이 처음 시작될 때 application(_:didFinishLaunchingWithOptions:) 메서드 호출 전에 호출
- application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
- applicationWillResignActive(_:)
- applicationDidEnterBackground(_:)
- applicationWillEnterForeground(_:)
- 앱이 백그라운드에서 포그라운드로 전환되기 직전에 호출
- applicationDidBecomeActive(_:)
- applicationWillTerminate(_:)
5. 앱이 In-Active 상태가 되는 시나리오를 설명하시오.
- 앱을 사용하다가 전화를 받거나, 알람, 알림이 울리는 등 외부의 요인으로 잠시 In-Active 상태가 될 수도 있다.
- Not Running -> Forground 상태로 전환할때, Foreground -> Background, Background -> Foreground상태가 될때에도 In-Active상태를 거친다.
[iOS]앱의 생명주기 (App LifeCycle)
6. scene delegate에 대해 설명하시오.
본래 AppDelegate에서 앱의 라이프사이클을 관리하는게 맞긴한데, iOS13부터 SceneDeleate가 나오면서, Scene마다 생명주기가 따로 생기게 되었다.
그러니까,, 원래는 같은 앱을 무조건 하나만 켤 수 있었는데, 이제는 한번에 여러 앱을, 하나의 앱을 여러개를 켤 수 있으니 각각의 생명주기가 따로 생성을 하기 위해 만들어진 객체이다.
7. UIApplication 객체의 컨트롤러 역할은 어디에 구현해야 하는가?
App Delegate에 구현하고 앱의 전반적인 동작을 조정하는 역할을 한다.
8. App의 Not running, Inactive, Active, Background, Suspended에 대해 설명하시오.
[iOS]앱의 생명주기 (App LifeCycle)