iOS

❓ AppDelegate와 SceneDelegate(1)

_yunie 2024. 6. 12. 18:51

안녕하세요!

여름감기로 고생 중인 Yunie입니다..🥲 여러분은 감기 조심하세요ㅠ

오늘은 이전부터 정리해둬야겠다고 마음만 먹고 미루고 미루던 AppDelegate에 대해 알아볼게요!

 

❓App LifeCycle

저 둘의 역할을 알기 위해서 우리는 우선, 앱의 생명주기에 대해 알아야 합니다

앱은 실행되고 종료되는 동안 총 5가지의 상태를 가집니다

그리고 표로 간략하게 정리해서 보여드리면 다음과 같아요 (생각보다 간단하죠..? )

 

이 중, Active와 InActive와 같이 화면에 앱이 띄워져 있는 상태를 Foreground라고 묶어서 칭해줄 수 있습니다

그리고 이와 반대 상태인 앱이 화면에서 사라진 상태를 Background라고 칭하게 되는 거죠!

 

 

❓App Delegate

 

이제 간단하게 앱이 어떤 생명주기를 가지고 동작하는지 알게 됐다면 AppDelegate의 역할에 대해 논의해 볼 수 있을 것 같아요🔥

 

AppDelegate의 역할은 iOS13을 기준으로 나뉩니다

SceneDelegate가 당시에 등장했기 때문이에요

 

iOS13 이전에는 AppDelegate가 모든 일을 도맡아서 했다면, 이후에는 SceneDelgate와 일을 나누어 처리하게 되었기 때문입니다!

 

먼저 이전의 AppDelegate에 대해 알아볼게요

iOS13 이전의 AppDelegate는 우리가 앞서 살펴본 앱의 생명주기 내 모든 동작을 관리했습니다

그래서 현재 SceneDelegate가 가지고 있는 메서드들도 모두 AppDelegate가 가지고 있었습니다

 

이때에는 이름도 조금씩 달랐는데, 이러한 메서드들이 AppDelegate 내에 있었던 시절이 있었던 겁니다..!

 

 

application(_: DidFinishLaunchigWithOptions:)

앱을 실행할 때 호출되며 앱 초기화 직후에 호출됩니다

 

applicationDidBecomeActive

앱이 Active 상태로 전환되면 호출됩니다

 

applicationWillResignActive

앱이 Active 상태에서 InActive 상태로 전환되기 전에 호출됩니다

 

applicationDidEnterBackground

앱이 Foreground에서 Background상태로 변경되고 호출됩니다

applicationWillEnterForeground 

앱이 Foreground로 변경되기 직전에 호출됩니다

 

applicationWillTerminate
앱이 종료될 때 호출되며 메모리에서 제거해줌을 의미합니다

일반적으로 사용자가 앱을 종료할 때는 앱이 백그라운드로 이동해 호출되지 않지만 시스템이 특정 이유(메모리 부족)으로 앱을 종료할 경우 호출됩니다

또한, Background를 지원하지 않는 앱이라면 사용자가 종료할 시에도 이 메서드는 항상 실행됩니다 

 

 

AppDelegate에 어떤 메서드들이 있었는지 간단하게 살펴봤는데, 딱 봐도 NotRunning, Foreground(InActive, Active), Background, Suspend 전 과정을 관리한다는 것을 알 수 있죠?

 

그럼 iOS13 이후 AppDelegate는 어떻게 변화했을까요?

우선 저 위의 6가지 중 무려 4가지의 메서드(앱의 상태와 관련된 메서드)가 SceneDelegate에게로 옮겨가며 앱의 실행과 종료(Process Lifecycle)에 관해서만 관리하게 되었습니다

 

 

그리고 SceneDelegate의 등장으로 Scene에 대한 정보를 받아오기 위해 Session Lifecycle이라는 것이 생겨났고 아래와 같은 2가지의 새로운 메서드를 가지게 되었습니다

// scene을 만드는 구성 객체를 반환
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration 

// scene을 닫을 때 호출 
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) 

 

그럼, 이제 자연스럽게 저 Scene이 무엇을 의미하는지 궁금해집니다

 

🧐 Scene이란 뭔가요?

 

iOS의 UI 구조는 아래 이미지처럼 구성되어 있다고 합니다

 

여기서 우리가 알고 싶은 건 저 친구! UIWindowScene입니다

그래도 저거 하나만 알고 가기 조금 아쉽잖아요?😉

그런 의미에서 UIScreen부터 UIWindow까지 알아가 봅시다

 

UIScreen은 하드웨어 즉, 내 아이폰, 아이패드의 화면 그 자체를 지칭하는 클래스입니다

그러니까 이 물리적인 스크린 위에 UIWindowScene을 여러 개 배치할 수 있고, 그 위에 UIWindow와 UIView가 쌓인다고 보시면 될 것 같습니다

 

다음은 UIWindowScene입니다

UIWindowScene은 UIScene 클래스를 상속받고 있습니다

그리고 하나 또는 여러 가지의 window를 관리하는 scene이라고 설명하고 있습니다

결국 Scene은 이미지처럼 하나 또는 두 가지 이상의 Window를 포함할 수 있는 하나의 인스턴스로 이 Scene을 관리해 주는 대상이 UIWindowScene이라고 이해하면 될 것 같습니다

 

마지막으로 UIWindow에 대해 알아볼까요?

UIWindow앱 UI의 배경이며 이벤트들을 뷰로 보내주는 객체라고 합니다

Window 자체가 시각적으로 보이고 있지는 않지만 앱의 View를 사용자에게 보여주는데 중요한 역할을 합니다

View라는 사진이 있으면 View를 보호해주고 있는 액자 같은 존재라고 생각해 주시면 될 것 같아요 🙂

 

만약, 이 계층을 좀 더 시각적으로 보고 싶다면 Xcode에서 개발한 앱을 실행하고 ‘Debug View Hierarchy’로 확인해 보실 수 있습니다!

 

마무리

 

오늘은 AppDelegate와 SceneDelegate 중 이전의 AppDelegate가 어떤 역할을 했는지, SceneDelegate가 생겨나며 함께 등장한 Scene이라는 것이 뭔지 알아봤습니다!

 

이제 다음 글에서는 본격적으로 SceneDelegate에 대해 적어보겠습니다!

만약 조금이라도 틀린 부분이 있다면 편하게 댓글 달아주세요!

배워가는 입장에서 많은 도움이 됩니다 ☺️

 

✏️ 오늘의 요약

  • iOS13을 기준으로 AppDelegate의 역할이 변화함
    • iOS13 이전에는 AppDelegate가 앱의 모든 생명주기를 관리
    • 현재는 앱의 실행과 종료에 관해서만 관리
  • UIScreen
    • 하드웨어적인 스크린을 의미
  • UIWindowScene
    • Scene이라는 하나 또는 두 가지 이상의 객체를 관리하는 관리자
  • UIWindow
    • 앱 UI의 배경으로 시각적으로 나타나지는 않음
    • View의 액자 같은 존재

 

📚 참고

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

https://velog.io/@lhj26/iOS-Scene-Delegate-vs-App-Delegate

https://infinitt.tistory.com/385