App / Scene Life cycle

J.Noma·2021년 11월 25일
0

iOS : View : UIKit

목록 보기
13/17
post-custom-banner

공식문서 : Managing Your App's Life Cycle


🌀 기본개념

🔸 Life Cycle이란?

Life cycle이란, App의 "상태" 개념을 말합니다. 예로, 어떤 App이 당장 화면에 보이고 있는 상태인지, 화면에 보이진 않지만 뭔가 동작 중이라던지 등이 해당됩니다. 이 상태에 따라 언제든지 가능한 작업과 그렇지 않은 작업이 다르므로, 우리는 App이 어떤 작업을 수행할 때 상태를 고려하도록 만들어야 합니다

UIKit은 App의 상태가 변경됨을 delegate 객체의 메서드를 호출함으로써 우리에게 알려줍니다. 우리는 이 메서드에 각 상태 별로 필요한 작업을 기술할 수 있습니다

🔸 iOS 버전에 따른 분기

iOS 13을 기점으로 Multiple Window를 지원하기 위해 Scene이라는 개념이 생겼습니다. Scene을 지원하는 App의 경우 Life cycle 노티를 수신하는 delegate가 AppDelegate가 아닌 SceneDelegate가 됩니다

정리하면, iOS 12까지는 항상 AppDelegate가 수신하고, iOS 13부터는 Info.plist에서
Scene configuration을 제공하는지 여부에 따라 AppDelegate 혹은 SceneDelegate가 수신합니다. 참고로, Scene configuration은 Xcode 프로젝트 생성 시 자동으로 추가되어 있어 기본적으론 SceneDelegate가 수신합니다

만약 Multiple Window를 지원하고 싶다면, Scene configuration에서 디폴트 false로 되어 있는 Scene Support를 true로 변경해주어야 합니다


🌀 Scene Life Cycle

🔸 Life Cycle

🔘 Scene Life Cycle

  • Unattached

    • scene은 만들어졌으나 아직 App에 연결되지 않은 상태
  • ForegroundInactive

    • 현재 UI에 보이는 상태이나 event를 수신할 수 없는 상태
  • ForegroundActive

    • 현재 UI에 보이는 상태이며 event를 수신가능한 상태
  • Background

    • 현재 UI에 보이지 않는 상태. background 상태에서는 screen 밖에 있으므로 가능한 최소한의 작업만 하거나 아무것도 하지 말아야 합니다.
  • Suspend

    • Background에 있다가 특별한 작업을 하지 않는 경우 suspend로 전환된다

🔘 일반적인 흐름

  1. 유저나 시스템이 App에게 새로운 scene을 요청하면 UIKit이 scene을 만들어 unattached 상태에 놓습니다
  2. 유저가 요청한 scene은 화면에 보여지는 상태인 foreground로 빠르게 이동합니다
    반면, 시스템이 요청한 scene은 일반적으로 이벤트를 처리하기 위해 background로 이동합니다 (ex. 시스템은 위치 이벤트를 처리하기 위해 background에 scene을 만들 수 있습니다)
  3. 이후 유저가 UI를 dismiss하면 UIKit이 해당 scene을 background 상태로 보내고 결국 suspended 상태가 됩니다
  4. UIKit은 background/suspended 상태의 scene에 할당된 시스템 자원을 회수하기 위해 언제든 종료시킬 수 있습니다 (이후 unattached 상태로 보냅니다)

🔸 상태 별 추천 task

  • UIKit이 scene을 App에 연결할 때
    scene의 초기 UI를 설정하고 scene에 필요한 data를 불러온다

  • forground-active 상태로 갈 때
    UI를 설정하고 유저 interaction을 준비한다
    Preparing Your UI to Run in the Foreground

  • forground-active를 떠나자마자
    data를 저장하고 App의 행동을 종료시킨다
    Preparing Your UI to Run in the Background

  • background에 진입하자마자
    중요한 task는 종료시키고 메모리는 가능한 한 해제시키며 App의 snapshot을 준비한다
    Preparing Your UI to Run in the Background

  • disconnection 될 때 (=goto unattached)
    해당 scene과 관련된 모든 공유 자원을 정리한다

  • App launch
    scene 관련 이벤트에 더해 App의 launch 상황에도 응답해야 한다 (UIApplicationDelegate 객체 사용)
    Responding to the Launch of Your App


🌀 App Life Cycle

iOS 12 이하 버젼에서는 scene을 지원하지 않기에 UIKit은 모든 life-cycle 관련 이벤트들을 UIApplicationDelegate 객체에게 전달합니다

App delegate는 App에 존재하는 모든 window들을 관리합니다
결과적으로, App의 상태 변화는 외부 display의 content를 포함한 전체 UI에 영향을 미칩니다

🔸 Life Cycle

🔘 App Life Cycle

  • Unattached

    • scene은 만들어졌으나 아직 App에 연결되지 않은 상태
  • ForegroundInactive

    • 현재 UI에 보이는 상태이나 event를 수신할 수 없는 상태
  • ForegroundActive

    • 현재 UI에 보이는 상태이며 event를 수신가능한 상태
  • Background

    • 현재 UI에 보이지 않는 상태
  • Suspend

    • Background에 있다가 특별한 작업을 하지 않는 경우 suspend로 전환된다

🔘 일반적인 흐름

  1. App을 launch하면, 시스템은 App을 일단 inactive 혹은 background 상태에 놓습니다 (UI가 화면에 나타나야 하는지 아닌지에 따라)

  2. foreground로의 launch가 완료되면, 시스템은 App을 자동으로 Active 상태로 만듭니다

  3. 그 후의 상태는 App이 종료될 때까지 ActiveBackground 사이를 왔다갔다합니다

🔸 상태 별 추천 task

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

안녕하세요 너무 좋은 글 감사합니다.
혹시 스터디 노션에 정리하고 공유를 해도 될까요 ? 출처는 해당 링크로 밝히겠습니다.

답글 달기