듀다의 성장개발로그

iOS Swift) iOS 앱의 생명주기 (SceneDelegate 포함) 본문

카테고리 없음

iOS Swift) iOS 앱의 생명주기 (SceneDelegate 포함)

du-da 2021. 4. 5. 19:24

Xcode 상에 무언가를 보여주는 데만 집중하다 보니 기초적인 내용에 대한 이해가 부족한 것 같아

오늘은 앱을 이해하는 데 가장 기초가 되는 앱 생명주기에 대한 내용을 가져와봤습니다.

 

검색해서 나오는 글은 AppDelegate를 이미 알고 있다고 가정하고 SceneDelegate와의 차이점을 설명하거나 AppDelegate만 있었던 버전을 기준으로 앱 생명주기를 설명하는 글이 대부분이라

저는 SceneDelegate가 포함된 버전을 기준으로 앱 생명주기를 처음부터 설명하도록 하겠습니다.

 

 

iOS 13이후의 scene-based 앱에선 각 생명주기의 이벤트를 처리하는 데 UISceneDelegate 객체를 사용합니다.

위 그림에서 점선은 시스템, 점선은 유저가 수행하는 동작입니다.
사용자가 앱에 새로운 scene을 요청하면 UIKit이 그걸 만들고 Unattached 상태로 놓습니다. 가장 왼쪽 파란 화면이 Unattached 상태를 나타냅니다. 
사용자가 화면을 요청하면 그 화면은 Foreground로 옮겨지고, Active 상태가 되면 이벤트를 처리할 수 있게 됩니다. inactive를 active로 바꾸는 것은 시스템의 역할입니다.
그리고 사용자가 앱을 종료하면 Foreground에서 Background 상태로 이동하고, Suspended 상태가 되어 리소스가 회수됩니다.

 

아래는 각 단계에서 UISceneDelegate가 호출하는 메소드입니다.

 

아이콘을 터치하여 앱을 실행하면

AppDelegate에서 didFinishLaunching를 호출합니다. 이 메소드는 앱을 준비가 되었음을 알려줍니다.

 

그리고 configurationForSession를 호출합니다. 이는 Scene Session을 추가하기 위한 메소드입니다.

 

그 다음엔 SceneDelegate에서 willConnectToSession을 호출합니다.

여기까지가 앱이 화면에 표시되기 전까지의 동작이었고요,

scene(_:willConnectToSession)이 호출되면

위에서 추가된 Scene Session가 UI와 연결되어 앱이 화면에 표시됩니다.

 

앱이 종료될 때 일어나는 동작들도 한 번 살펴보겠습니다.

 

다른 화면(Scene)으로 전환될 때 willResignActive가 호출됩니다. 이름처럼 scene과의 상호작용이 중지된다는 것입니다.

화면이 백그라운드로 진입하면 didEnterBackground가 호출됩니다.

 

 

Scene이 연결될 때 willConnectToSession가 호출되었던 것처럼 Scene의 연결이 해제되면 didDisconnect가 호출됩니다.

 

 

Scene Session이 삭제되면 didDidcardSceneSession이 AppDelegate에서 호출되고 종료 작업도 마무리됩니다.

 

 

앱 생명주기를 알고 있으면 앱이 실행되는 동안 어떤 동작이 이루어지는지를 이해할 수 있고 필요한 동작을 적절한 시점에 넣는 데 도움이 될 것입니다.

앱 생명주기 포스팅은 여기서 마무리하겠습니다. 읽어주셔서 감사합니다.

 

참고자료:

developer.apple.com/videos/play/wwdc2019/258/

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