[iOS] AppDelegate와 SceneDelegate, App의 Life Cycle(생명주기)

2023. 2. 24. 07:52iOS/iOS

728x90
반응형

👉 Life Cycle (생명주기)

  • 생명주기란 앱의 최초 실행과 종료 사이에 발생하는 이벤트로 구성된다.
  • 생명주기에는 App 생명주기와 ViewController 생명주기가 있다.

2023.02.24 - [iOS/iOS] - [iOS] ViewController의 생명주기(Life Cycle)

 

 


👉 AppDelegate와 SceneDelegate

iOS 12 이전  iOS 13 이후
  • iOS 12 까지는 대부분 하나의 앱에 하나의 window였지만 iOS 13부터는 window의 개념이 scene으로 대체되고 하나의 앱에서 여러개의 scene을 가질 수 있다.
    기존에는 한 번에 하나의 화면만 보여주었지만 이제는 동일한 앱을 스플릿뷰로 나눠서 실행할 수 있게 되었다.
    이런 경우 사용자가 실제로 사용하는 앱은 하나지만 화면에 보이는 Scene은 여러개가 될 수 있기에 이를 독립적인 생명주기를 갖게 하기 위해서
    SceneDelegate 에서 관리한다.
  • AppDelegate의 역할은 앱 생명주기(앱의 실행과 종료), SceneDelegate의 역할은 UI 요소의 생명주기 (백그라운드 상태 로직)를 처리하는 것이다.
  • AppDelegate 에는 Session LifeCycle 에 대한 부분이 추가되었다.
    Scene Session 이 생성되거나 삭제될 때 AppDelegate 에 알리는 메소드가 추가되었다.
    Scene Session 은 앱에서 생성된 모든 Scene의 정보를 관리한다.

 

 

✔️  Scene

UIKit은 객체를 사용하여 앱 UI의 각 인스턴스를 관리합니다 . Scene 에는 UI의 한 인스턴스를 표시하기 위한 windows와 뷰 컨트롤러가 포함됩니다. 각 Scene에는 UIKit과 앱 간의 상호 작용을 조정하는 데 사용하는 해당 개체도 있습니다 . Scene은 서로 동시에 실행되어 동일한 메모리와 앱 프로세스 공간을 공유합니다. 결과적으로 단일 앱에 여러 장면과 장면 대리자 개체가 동시에 활성화될 수 있습니다.

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

 

Scenes | Apple Developer Documentation

Manage multiple instances of your app’s UI simultaneously, and direct resources to the appropriate instance of your UI.

developer.apple.com

 

 

✔️  Scene Session

UISceneSession 객체는 장면의 고유한 런타임 인스턴스를 관리합니다. 사용자가 앱에 새 Scene을 추가하거나 프로그래밍 방식으로 요청하면 시스템에서 해당 Scene을 추적하기 위해 Session 개체를 만듭니다. Session 에는 고유 식별자와 Scene의 구성 세부 정보가 포함됩니다. UIKit은 Scene 자체의 수명 동안 Session 정보를 유지하며 사용자가 App switcher 에서 Scene을 닫는 것에 대한 응답으로 Session을 파괴합니다.

Session 개체를 직접 만들지 않습니다. UIKit은 앱과의 사용자 상호 작용에 대한 응답으로 Session 을 생성합니다. requestSceneSessionActivation(_:userActivity:options:errorHandler:)의 메소드를 호출하여 프로그래밍 방식으로 새 Scene과 Session을 생성하도록 UIKit에 요청할 수 있습니다. UIKit는 앱의 Info.plist 파일 내용을 기반으로 기본 구성 데이터로 Session을 초기화합니다.

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

 

UISceneSession | Apple Developer Documentation

An object that contains information about one of your app’s scenes.

developer.apple.com

 

 

 

👉 iOS 13.0 이후의 AppDelegate 역할

  • 앱의 가장 중요한 데이터 구조를 초기화한다.
  • Scene을 환경설정한다.
  • 앱 밖에서 발생하는 알림(배터리 부족, 전화 수신)을 대응한다.
  • 특정 Scene. View, ViewController 에 한정되지 않고, 앱 자체를 타깃으로 하는 이벤트에 대응한다.
  • 애플 푸시 알림 서비스처럼 실행 시 요구되는 모든 서비스를 등록한다.

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

 

UIApplicationDelegate | Apple Developer Documentation

A set of methods to manage shared behaviors for your app.

developer.apple.com

 

 

 


👉 App LifeCycle

빨간색 : AppDelegate / 검정색 : SceneDelegate

  • 앱이 실행되지 않는 상태 (메모리에 올라오지 않은 상태)

 

✔️  Unattached

  • 앱이 실행되지 않는 상태 (메모리에 올라오지 않은 상태)
  • Scene 이 앱과 연결되지 않은 상태로 시스템이 Scene에 연결 알림을 보낼 때까지 이 상태를 유지한다.

 

✔️  Foreground

  • Inactive
    실행 중이지만 이벤트를 수신하지 않은 상태
    전화나 알람 등으로 앱이 잠시 비활성화되는 상태
    앱의 모든 동작을 사용자가 전부 컨트롤할 수 없는 상황이면 Inactive 상태이다.
    ex) 시스템 알람, 제어센터 내리기, App-switching
  • Active
    실행 중이면서 이벤트를 수신 중인 상태
    Active Scene 은 화면에 표시되며 사용자가 볼 수 있다.

 

✔️  Background

  • 실행 중이지만 화면에는 보이지 않는 상태
  • 음악 재생같은 앱이 아니라면 최소한의 동작을 수행해야 하기 때문에 아무것도 안하는 것이 가장 베스트이다.
    음악 재생, 사용자 위치 사용 과 같은 경우를 제외하면 Background 에서 Unattached 상태로 바꿀 수 있다.

 

✔️  Suspended

  • 앱이 일시 중단된 상태, 다음 실행을 기다리는 대기 상태
  • 앱이 Background 상태에서 추가적인 작업을 하지 않으면 바로 Suspended 상태로 진입한다.
  • 앱을 다시 실행할 경우 빠른 실행을 위해 메모리에만 올라가있다.
    하지만 메모리가 부족할 경우에는 Unattached 상태로 변경하여 부족한 메모리를 확보한다.

 

 

👉 SceneDelegate의 생명주기 메소드

 

✔️  scene()

  • scene이 앱에 추가될 때 호출되는 함수
  • 여기서 ViewController와 같은 클래스 객체를 만들어 사용할 때, 아직 viewDidLoad() 가 호출되지 않는다.

 

✔️ sceneDidDisconnect()

  • 시스템에 의해 종료되었을 때 호출되는 함수

 

✔️ sceneDidBecomeActive()

  • scene 이 Active 상태로 이동할 때 호출되는 함수
  • 앱 스위처 화면에서 선택되는 등 scene 과의 상호작용이 시작될 때 호출된다.

 

✔️ sceneWillResignActive()

  • scene 이 Inactive 상태로 이동할 때 호출되는 함수
  • 일시적인 중단으로 인해 발생한다.

 

✔️ sceneWillEnterForeground()

  • scene 을 foreground로 이동할 때 호출되는 함수
  • 새로 만든 scene과 연결된 scene 모두에서 발생한다.
  • 화면이 나타나기 위해 foreground로 이동하기 떄문에 항상 sceneDidBecomeActive() 메소드를 호출한다.

 

✔️ sceneDidEnterBackground()

  • scene 을 Background로 이동할 때 호출되는 함수
  • scene 의 메모리 사용을 줄이고 공유 리소스를 확보한다.

 

 

 

👉 SceneDelegate의 생명주기 메소드 호출

✔️  앱을 처음 실행했을 때

  • Scene 이 앱에 추가되는 순간 willConnectTo() 호출
  • foreground 로 이동하기 전 sceneWillEnterForeground() 호출
  • Inactive 상태에서 Active 상태로 변하면서 sceneDidBecomeActive() 호출

 

 

✔️  홈 화면으로 나갔을 때

  • Active 상태에서 Inactive 상태로 변하므로 sceneWillResignActive() 호출
  • Background 로 전환되면서 sceneDidEnterBackground() 호출

✔️  홈 화면에서 다시 앱으로 돌아왔을 때

  • Foreground 로 돌아오면서 sceneWillEnterForeground() 호출
  • Inactive 상태에서 Active 상태로 변하면서 sceneDidBecomeActive() 호출

 

 

✔️  제어 센터를 내렸을 때

알림 센터를 내렸을 때
 
제어 센터를 내렸을 때
 
알림 센터는 사용자가 내리고 싶은 만큼 내릴 수 있고 다시 취소할 수 있기에 내리는 중간에 Active 상태로 변했다가 다시 Inactive로 변한다.
제어 센터는 내리려고하면 한 번에 내려가기때문에 바로 Inactive 상태로 변한다.
  • Active 상태에서 Inactive 상태로 변하므로 sceneWillResignActive() 호출

✔️  제어 센터를 올렸을 때

  • Inactive 상태에서 Active 상태로 변하면서 sceneDidBecomeActive() 호출

 

 

✔️  앱 스위칭할 때

  • Active 상태에서 Inactive 상태로 변하므로 sceneWillResignActive() 호출

✔️  앱 스위처에서 앱으로 돌아왔을 때

  • Inactive 상태에서 Active 상태로 변하면서 sceneDidBecomeActive() 호출

✔️  앱 스위처에서 다른 앱을 실행했을 때

  • Background 로 전환되면서 sceneDidEnterBackground() 호출

✔️  앱 스위처에서 다른 앱을 실행하고 다시 앱으로 돌아왔을 때

  • Foreground 로 돌아오면서 sceneWillEnterForeground() 호출
  • Inactive 상태에서 Active 상태로 변하면서 sceneDidBecomeActive() 호출

 

 

✔️  앱을 종료할 때

  • 앱이 종료되면 sceneDidDisconnect() 호출

 

 

 

 


📂  정리

AppDelegate SceneDelegate
앱 생명주기 UI 요소의 생명주기

 

 

 

 

 

 

 

 

[예제 소스코드 깃허브 링크]

https://github.com/HANLeeeee/PracticeTest/tree/main/LifeCycleTest

 

GitHub - HANLeeeee/PracticeTest

Contribute to HANLeeeee/PracticeTest development by creating an account on GitHub.

github.com

 

[참고자료]

https://lena-chamna.netlify.app/post/appdelegate_and_scenedelegate/#AppDelegate%EC%99%80-SceneDelegate

 

[iOS] AppDelegate와 SceneDelegate

iOS 13 이후 AppDelegate와 SceneDelegate

lena-chamna.netlify.app

https://jeong9216.tistory.com/461

 

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

앱의 생명 주기 앱이 최초 실행될 때부터 앱이 종료될 때까지 앱은 여러 상태를 가집니다. 많이 들어보셨을 background, foreground도 앱의 생명 주기 중 하나이죠. 참고로 앱의 생명 주기는 공식 문서

jeong9216.tistory.com

 

 

 

 

 

 

728x90
반응형

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

[iOS] UIView의 Life Cycle (생명주기)  (0) 2023.03.09
[iOS] super.viewDidLoad() 호출하는 이유  (0) 2023.03.07
[iOS] ViewController의 Life Cycle(생명주기)  (0) 2023.02.24
[iOS] Frame 과 Bounds  (0) 2023.02.14
[iOS] SafeArea  (0) 2023.02.11