iOS 개발/iOS

[iOS] 앱 생명주기 (App LifeCycle)

꽁치대디 2022. 6. 24. 00:54

[iOS] 앱 생명주기 (App LifeCycle)

생명주기란, 앱이 최초 실행될 때부터 앱이 종료될때까지의 주기를 뜻하며, 앱은 이 주기동안 여러 상태를 가집니다.

 

오늘은 iOS 앱의 생명주기에 대해 알아보도록 하겠습니다.

앱의 상태

앱의 상태는 현재 수행 가능한 동작과 수행 불가능한 동작을 결정짓습니다.

예를 들어 Foreground 상태인 앱은 화면을 점유하고 있기 때문에 시스템 리소스보다 높은 우선순위를 가지고 있습니다.

 

반대로 Background 상태인 앱은 최소한의 작업을 수행해야 합니다. 사실 가급적이면 아무것도 하지 않는게 좋습니다.

 

만약 앱의 상태가 변경된다면, 앱은 그에 따라 다른 동작을 수행해야 합니다.

 

이러한 상태들과 생명주기는 iOS 12 까지 UIApplicationDelegate 객체를 이용해 관리했지만, iOS 13 부터는 UISceneDelegate 객체를 이용해 관리합니다.

~ iOS 12 (App-Based)

iOS 12 까지는 Scene 을 지원하지 않아 모든 생명주기 이벤트를 UIApplicationDelegate 에 전달했습니다. 

 

App Delegate 는 앱의 모든 window 를 관리했으며, 결과적으로 앱의 상태전환은 앱 전체 UI 에 영향을 끼칩니다.

 

 

생명주기를 위 이미지와 같이 나타낼 수 있는데, 정리하자면 다음과 같습니다.

 

  • 앱 실행 후 시스템은 UI 가 화면에 표시되는지에 따라 앱을 Inactive 나 Background 로 변경
  • Foreground 상태가 될 때 시스템은 앱을 자동적으로 Active 로 변경
  • 이후 앱이 종료될 때까지 Active 혹은 Background 를 상태를 왔다갔다 함

 

하지만 현재 카카오톡이나 당근마켓 등 굉장히 많은 사용자들을 보유하고 있는 앱들의 최소 버전은 대부분 iOS 13 이상입니다.

 

물론 아직도 App-Based 생명주기를 이용하는 분들도 계시겠지만, 오늘은 Scene-Based 앱에 대해서 더 중점적으로 다뤄보도록 하겠습니다.

iOS 13 ~ (Scene-Based)

iOS 13 부터 UIKit 은 각 Scene 에 대해 별도의 생명주기 이벤트를 제공합니다. 

 

Scene 은 기기에서 실행되는 앱 UI 의 인스턴스를 나타내는데, 사용자는 각 앱에 대해 여러 scene 을 만들고 이를 별도로 표시하거나 숨길 수 있습니다.

 

각 scene 마다 생명주기가 있어서 상태가 모두 다를 수 있습니다. Scene-Based 생명주기는 일반적으로 다음과 같습니다.

 

  • 사용자 혹은 시스템이 앱에 새로운 scene 을 요청하면 UIKit 이 이를 생성하고 Unattached 상태로 둠
  • 사용자가 요청한 scene 은 Foreground 로 이동해 화면에 나타남
  • 시스템이 요청한 scene 은 이벤트를 처리할 수 있도록 일반적으로 Background 로 이동
    • 예를 들어 시스템이 Location 이벤트를 처리하기 위해 Background 에서 scene 을 시작할수도 있음
  • 사용자가 앱의 UI 를 닫으면 UIKit 은 연결된 scene 을 Background 로 이동시키고 나중에는 Suspended 로 변경
  • UIKit 은 리소스 회수를 위해 언제든 Suspended 혹은 Background 상태의 scene 과의 연결을 끊고 해당 scene 을 Unattached 상태로 변경할 수 있음

 

이처럼 scene 은 여러 상황에 따라 상태를 변경합니다.

 

이 상태들은 UIKit 의 UISceneDefinitions.h 파일에서 찾아볼 수 있습니다. 코드의 마지막 줄에 iOS 13.0 부터 사용이 가능하다고 쓰여져있기도 합니다.

 

해당 상태들에 대해 더 자세히 알아보겠습니다.

Unattached

  • 사용자 혹은 시스템이 앱에 새로운 scene 을 요청하면 UIKit 이 이를 생성하고 Unattached 상태로 둠

Foreground

  • Scene 이 현재 화면을 점유하고 있는 상태
  • 시스템 리소스에 대한 우선순위를 가짐
  • Active
    • 이벤트들을 받고 있는 상태
    • 일반적으로 앱이 돌아가고 있는 상태
  • Inactive
    • 이벤트들을 받고 있지 않는 상태
    • Scene 이 다른 상태에서 Active 로 전환되거나, Active 에서 다른 상태로 전환되는 동안 Inactive 상태를 거침
    • 외부적인 Interrupt 에 의해 Inactive 상태가 될 수 있음
    • ex) 시스템 알람, 제어센터 내리기, App-switching 등

Background

  • Scene 이 현재 화면을 점유하고 있지 않은 상태
  • Background 에서 동작되고 있는 상태, 가능한 최소한의 동작을 수행함
  • ex) 네트워크, 타이머, 음악재생 등

Suspended

  • 실제로 위 case 에 존재하지는 않지만, 앱이 Background 에 있으며 아무 동작도 실행되지 않는 상태를 의미
  • 시스템이 임의로 Background 상태의 앱을 Suspended 로 만듬 (리소스 해제)

 

이렇게 앱의 상태들을 살펴보았지만, 어느 상황에서 어느 상태로 진입하는지 100% 이해가 되지는 않습니다.

 

저는 ViewController 의 생명주기를 학습할때, 직접 생명주기 메소드들에 출력 코드를 작성하여 콘솔에서 해당 메소드가 언제 호출되는지 학습했습니다.

 

당연하게도 scene 또한 생명주기 메소드를 가지고 있기 때문에, 예시를 통해서 앱의 상태를 학습해보도록 하겠습니다. 그 전에 일단 생명주기 메소드들에 대해 알아보겠습니다.

UISceneDelegate 생명주기 메소드

UISceneDelegate 의 생명주기 메소드들은 SceneDelegate.swift 파일에 작성되어있는 것을 확인할 수 있습니다.

 

SceneDelegate.swift 파일에 직접 메소드에 대한 설명을 작성했습니다. 또한 각 메소드가 호출될 때 콘솔에 메세지를 출력하도록 했습니다.

 

앱을 시동하면

Scene 이 생기고, Foreground 로 진입한 뒤 Active 상태가 됩니다. 콘솔에는 출력되지 않았지만, Foreground 에 진입할 당시에는 Inactive 상태였다가 이벤트를 받을 수 있는 상태가 되며 Active 상태가 되었을 것입니다.

 

그럼 앱을 App Switcher 로 보내보겠습니다. 

Scene 은 현재 화면에 나타나고 있지만 이벤트를 받을 수 없는 상태, 즉 Inactive 상태가 되었습니다. 

 

여기서 홈 화면으로 나간다면

Scene 은 Background 상태가 됩니다. 

 

다시 앱을 켜면 

Scene 은 Foreground 로 들어온 다음 Active 상태로 변경되고, 

 

앱을 완전히 종료시키면

Scene 과의 연결이 끊깁니다.

 

간단하게 앱을 켜고 홈화면으로 나가는 과정을 정리해보자면

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

정도가 될 것입니다. 

 

참고 링크

https://developer.apple.com/documentation/uikit/uiscenedelegate

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 

Apple Developer Documentation

 

developer.apple.com

https://medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-%EC%95%B1-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-878dfe51d182

 

오늘의 Swift 상식 (앱 생명주기)

앱 생명주기(App’s Life Cycle)란?

medium.com

https://coding-sojin2.tistory.com/196

 

[iOS] App의 생명주기 (Life Cycle)

생명주기 (Life Cycle)🤔 ? 생명주기라는 것은 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻합니다. 앱의 상태는 앱이 현재 어떠한 것을 할 수 있

coding-sojin2.tistory.com

https://velog.io/@dev_jane/AppDelegate%EC%99%80-SceneDelegate

 

AppDelegate와 SceneDelegate

iOS는 사용자가 앱을 직관적인 방법으로 사용할 수 있도록 디자인되었다. 따라서 iOS 개발을 하면서 우리는 사용자 경험이 물 흐르듯이 자연스럽게 이루어질 수 있도록 신경써야한다. 그러한 관

velog.io

https://ios-development.tistory.com/53

 

[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate

1. iOS12이하 버전 : App하나는 오로지 각각 하나의 Process와 UI를 유지 (AppDelegate에서 모두 관여) - Process Lifecycle : Process 상태 - UI Lifecycle : active, inactive, background, foreground 상태 관..

ios-development.tistory.com

 

'iOS 개발 > iOS' 카테고리의 다른 글

[iOS] Delegate Pattern  (0) 2022.07.06
[iOS] UINavigationController  (0) 2022.06.30
[iOS] Frame & Bounds  (0) 2022.06.17
[iOS] UITableView & UICollectionView  (0) 2022.06.17
[iOS] ViewController LifeCycle (생명주기)  (0) 2022.06.16