App LifeCycle에 대해

JinSeok Hong·2021년 7월 30일
0

App Lifecycle에 대해


최근 푸쉬알림 기능을 공부하는 중 의문이 들었다.
푸쉬알림은 보통 앱이 닫혀있는 경우에 오는데 어느 타이밍에 어떻게 처리하는 것일까?
기능을 구현하기 전에 앱의 생명 주기 지식에 대한 필요성을 느껴 공부를 하려한다.
앱의 주기에 대해 검색해보면 많은 분들이 정리한 내용들이 있지만 직접 정리해보자.

참고 문서 : https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle


State


앱의 상태는 크게 5가지로 나뉜다.

  • Not Running : 앱이 실행되지 않은 종료된 상태
    UIApplicationDelegate :
    application(:willFinishLaunchingWithOptions:) - 앱 실행 준비 메소드
    applicationDidFinishLaunching(
    :) - 준비 완료 후 사용자에게 보여지기 직전
    applicationWillTerminate(_:) - 앱이 종료되기 직전

  • In-Active : 앱이 실행되었지만 어떠한 이벤트도 받지 않는 상태
    UISceneDelegate :
    sceneWillEnterForeground(:) - background or not running 상태에서 foreground로 들어가기 직전
    sceneWillResignActive(
    :) - 활성화 상태가 되기 직전

  • Active(활성화) : 앱이 실행 중이며 이벤트를 받고 있는 상태
    UISceneDelegate :
    sceneDidBecomeActive(_:) - 활성상태 진입 직후.

  • Background : 앱이 백그라운드에 있는 상태이며 실행해야 할 코드가 있는 상태
    UISceneDelegate :
    sceneDidEnterBackground(_:) - 백그라운드 상태로 들어갔을 때, 중요 데이터 저장 등 종료 직전 작업 수행

  • Suspended : 앱이 백그라운드에 있는 상태이며 실행해야 할 코드가 없는 상태


SceneDelegate


이러한 상태에 따라 우리는 어떠한 작업을 처리한다. 예를 들어 Not Running 상태에서 앱을 처음 실행시켜 forground상태로 바꾸기도 하고, foreground 상태에서는 CPU를 포함한 시스템 리소스를에서 높은 우선순위를 갖고 동작하며 홈키를 누르거나 다른 앱을 키면 background 상태로 변화하여 가능한 적은 작업을 처리하며 CPU, memory를 아끼곤 한다.
따라서 우리는 앱의 상태의 변화에 따라 적절한 작업을 처리해주어야한다.

오케이! 이제 AppDelegate.swift를 공부하려고 하는 순간 새로운 것을 알게됐다.

Notice

  • iOS 12 이전으로는 주기 이벤트에 반응하기 위해 UIApplicationDelegate 객체를 사용했다.
  • iOS 13 이후로 부터는 scene-base app의 주기에 따른 이벤트에 반응하기 위해 UISceneDelegate 를 사용한다.


iOS 13부터는 AppDelegate에서 프로세스의 주기와, UI 주기를 둘다 관리하는 것이 아니라
Process 주기는 AppDelegate가, 그리고 UI 주기는 SceneDelegate가 처리하는 것이다.
단, Scene Session이 생성, 삭제 시에는 AppDelegate에 알려 UISceneSession Lifecycle을 관리하도록 한다.

여기서 또 한가지 주목해야 할 변화는 scene이다. window가 SceneDelegate에 옮겨짐에 따라 multiple windows 에 대한 사용이 가능하며 scene에서는 여러 windows와 이용하는 것이 가능하기에 다충 창을 활용한 앱 개발이 가능해졌다는 점이다.


AppDelegate


이제 우리는 AppDelegate에서는 프로세스의 주기, 세션의 주기를 관리하고, SceneDelegate에서는 UI 주기를 관리한다는 것을 알았다.
그럼 새로운 프로젝트를 열어보면 AppDelegate.swift의 상단에는 @main 라는 annotation이 존재할까?
쉽게 생각하면 AppDelegate가 프로세스를 관리하기 때문이다. 결국 @main은 파일의 시작점을 명시해주고 main은 UIApplicationMain 함수를 호출하고, 앱이 작동하기 위해 필요한 UIApplication 객체를 생성해준다. 당연히 프로그램은 하나의 메인을 가지고 작동하기 때문에 c언어를 생각해보면 쉽게 main은 한 곳에서 실행되고 이것은 처음 앱이 실행되는 프로세스 주기를 관리하는 AppDelegate에 명시되고 동작하는 것이다.

이제 이렇게 생성된 UIApplication 객체는 싱글톤 패턴이 적용되어 delegate를 생성하고, Event Cycle을 설정한다. 이제 Event Loop에서 발생하는 이벤트들을 감지하고 전달되는 메세지를 Delegate를 통해 전달받고 그에 따른 작업을 처리한다.


이렇게 App의 LifeCycle에 대해 공부해보았는데 혹시 잘못됐거나 궁금한 어떠한 이슈라도 있으면 꼭 댓글을 달아 서로 공유했으면 좋겠다.

누구라도 환영입니다. 같이 성장해요 :)

0개의 댓글