[iOS] iOS App Life Cycle

Hyunndy·2023년 2월 18일
0

iOS-App-Structure

목록 보기
1/8

🐸

iOS의 App Life Cycle에 대해 정리해보겠습니다.
Managing your app’s life cycle
Scene Support 버전은 일단 제하고, app-based life cycle만 정리하겠습니다!


개요

App의 현재 상태에 따라 수행할 수 있는 작업과 없는 작업이 결정됩니다.
예를 들어

  • foregorund 상태: CPU를 포함한 시스템 리소스 보다 우선 순위가 높다.
  • background 상태: 가능한 적은 작업을 수행해야 하며, 화면 밖에 있기 때문에 아무 작업도 수행하지 않는 것이 좋다.

App이 상태 변환을 하면 그에 따라 동작을 조정해야 합니다.
App의 State가 변경되면 UIKit은 적절한 delegate 객체를 통해 개발자에게 알려줍니다.

  • iOS 13 이상 && Scene Support O: UISceneDelegate가 scene-based App에서 life-cycle 이벤트에 응답해줍니다.
  • iOS 12 이하 || Scene Support X : UIApplicationDelegate가 life-cycle 이벤트에 응답

App State

iOS12 이하 || Scene Support X 환경에서 UIKit은 UIApplicationDelegate에 모든 life-cycle-events를 전달합니다.
App Delegate는 모든 App의 windows를 관리하기 때문에! App State 전환이 App의 전체 UI에 영향을 미칩니다.

iOS App에는 5가지 App State가 존재합니다.

1️⃣ Not Running, Foreground( 2️⃣ Inactive, 3️⃣ Active), Background( 4️⃣ Background), 5️⃣ Suspendend

Foreground와 Background

상태를 보면 Foreground와 Background가 있는데요.

둘 다 App이 메모리에 올라가 있지만,
Foreground는 앱이 화면에 보이는 상태
Background는 앱의 화면이 보이지 않는 상태
라는 차이점이 있습니다.

Not Running

App이 launch 되지 않은 상태를 말합니다.

(Foreground) Inactive

Foreground에서 running 되고 있지만, 사용자에게 Event는 수신하지 않는 상태

Inactive 상태가 뭘까요?
UI가 보이긴하는데, 사용자에게 이벤트는 받지 못한다?!
App이 Background로 전환되거나, Background에서 돌아올 때의 interruption 상태라고 하네요.

Inactive 시나리오

  • 사용자의 입력을 App에서 받을 수 없는 상태
    - 전화, SMS 메세지, 시스템 메세지(배터리), 알림이 표기가 떳을 때, 재난 문자 왔을 때
    - 사용자가 끌어올려서 app switcher로 갔을 때
    - 잠금 상태인 경우
  • 다른 State로 전환되는 동안에도 잠시 머무를 수 있음

잠시간의 interruption 상태이니 Inactive 상태에 들어오면 다른 상태로 다시 전환됩니다.

예를들면, 카카오톡 사용하다가 뱅크샐러드에서 왜 안보시나요(ㅜㅜ) 알림이 뜨면 잠시 카카오톡은 InActive 상태가 되고, 알림을 위로 끌어올려 없애면 Active, 알람을 눌러 뱅크샐러드로 이동하면 Background 상태로 전환되겠지요.

(Foreground) Active

Foreground에서 running 되고, 사용자에게 Event를 수신하는 상태
Active 상태가 되거나, 탈출할 때는 무조건 InActive 상태를 통해야만 합니다.

위의 Inactive에서 다른 State로 전환되는 경우에도 잠시 머무를 수 있다 했는데, 여기서 InActive -> BackGround 상태로의 전환을 예시로 들 수 있겠네요.

(Background) Background

app이 Background에서 실행되고 코드를 실행시키는 상태
메모리에 올라가있지만 화면에 보이지는 않는 상태이죠!

Background 상태로 전환되기 전에 호출된 Task가 끝나지 않은 경우 그 Task는 Background에서도 여전히 실행됩니다.
Background 상태로 전환된 후 호출된 Task는 App이 Foreground 상태로 전환된 후에 실행됩니다.

Background 상태가 되는 시나리오

App이 처음 launch하면 바로 Inactive -> Active 상태로 전환됩니다.

하지만 App이 suspended한 상태에서 다시 실행되면 App은 Background -> Inactvie -> Active 상태로 전환됩니다.
또한 App이 바로 Background 상태로 실행된다면, Background 상태가 Inactive 상태를 대신하게 됩니다.

구체적인 상황은 어떨까요?

  • Foreground 상태에서 다른 App을 실행하거나 HomeScreen으로 이동한 상태

👩‍💻 그럼 음악 재생 앱이나 네비 앱 같은 경우 App을 닫아도 실행되고, 알림같은건 어떻게 오는건가요?

정리 필요

Suspended

App이 Background에 있지만 코드를 실행시키지 않는 상태

App을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해 메모리에 최소한의 관련 데이터만 저장되어 있는 상태 입니다.

Suspended 상태의 App들은 메모리가 부족해지면 가장 먼저 메모리에서 해제됩니다.
따라서 App을 종료시킨적이 없더라도 App을 다시 실행하려고 하면 처음부터 다시 실행됩니다.

Suspendend 상태가 되는 시나리오

App이 Background에 진입했을 때 별다른 작업을 하지 않으면 Suspended 상태로 진입합니다.


Respond to app-based life-cycle events

5가지 App State를 보았으니, 이제 문서의 App-based life-cycle Events를 보겠습니다.

Not Running 상태에서 App launch 후 메모리에 올라가면, UI가 화면에 표시될지 여부에 따라서

  • Foreground (Inactive -> Active)
  • Background (Background)

상태로 전환합니다.
그 이후로는, state는 app이 꺼질 때 까지 active와 background 상태를 왔다갔다 합니다.
정확히는! background <-> Inactive <-> Active 입니다.

App 상태 전환을 이용해서 AppDelegate & SceneDelegate에서 다음과 같은 작업을 할 수 있습니다.
1. Launch할 때, App의 Data Structure와 UI를 초기화 합니다

👩‍💻 Responding to the launch of your app 글을 참고해주세요!

  1. active 될 때 UI 구성을 완료하고 user와의 상호작용을 준비 한다. (At activation, finish configuring your UI and prepare to interact with the user.)

👩‍💻 Preparing your UI to run in the foreground 글을 참고해주세요!

  1. 비활성화 시 data 저장하고 app의 행동을 멈출 수 있다.

👩‍💻 Preparing your UI to run in the background 글을 참고해주세요!

  1. Background 상태에 들어가면 중요한 Task를 완료하고 가능한 한 많은 메모리를 확보하고 App Snapshot을 준비한다.

👩‍💻 Preparing your UI to run in the background 글을 참고해주세요!

  1. 종료 시 모든 작업을 즉시 중단하고 공유 리소스를 해제한다.

👩‍💻 applicationWillTerminate(_:) 이 함수에서 진행하세요.


Respond to other significant events

Life-Cycle 이벤트를 핸들링하는거 외에도, 앱은 다른 이벤트를 받는 준비를 해야만 합니다.
주로 AppDelegate에 정의되어 있습니다.
경우에 따라 notification으로 핸들링할 수 있으므로 앱의 다른 부분에서 응답할 수 있습니다.

  1. Memory warning
  • 앱의 메모리 사용량이 높을 때 수신된다. App의 메모리 사용량을 줄이기 위해 참고하세요.

    정리 필요

  1. Protected data becomes available/unavailable
  • 유저가 디바이스를 lock, unlock 할 때 수신된다.

    정리 필요

  1. Handoff tasks

    👩‍💻 Handoff Task란?
    Handoff를 사용하면 한 기기에서 시작한 작업을 주변의 다른 기기로 전환하여 계속 이어서 할 수 있다.

  • NSUserActivity 객체를 처리할 때 수신된다.

    정리 필요

  1. Time changes
  • 이동통신사가 시간 업데이트를 보내는 경우와 같이 여러가지 시간 변경에 대해 수신할 수 있다.

    정리 필요

  1. Open URLS
  • 앱에서 리소스를 열어야 할 때 수신된다.
    👩‍💻 openURL을 참고하세요!

느낀점

App의 기본 Life Cycle과 5가지 App State를 정리했습니다.
AppDelegate, SceneDelegate의 delegation method까지 정리하면 너무 길어질 것 같아서 따로 글로 파겠습니다.

profile
https://hyunndyblog.tistory.com/163 티스토리에서 이사 중

0개의 댓글