공부하며 적은 글입니다! 내용이 정확하지 않을 수 있습니다.
보통 앱을 만들기 시작하고 진행을 할 때 앱의 생태주기, 그러니까 앱이 어느 시점에 켜지고, 꺼지고, 대기하고 등등을 잘 모른다. 나도 잘 모르고 있는 상태이기도 하다.
따라서 이 부분을 오늘 한번 제대로 알아보고자 한다!
아니다. 진짜 아니다. 다음 상황을 생각 해보자.
넷플릭스를 보고 있는 XXX(23세) 는 갑자기 온 친구의 카톡에 답장을 하기 위해 잠시 카톡을 들어가서 답장을 하고 왔다. 근데? 앱 라이프 사이클이 잘못 작동하여 보고 있던게 초기화 되고 다시 앱이 실행이 됐다.
아..🥲상황만 들어도 짜증난다.
이렇게 상황을 나눠서 구현한다면, 이러한 상황을 극복할 수 있다!
앱의 동작은 크게 다섯가지로 표현할 수 있다.
앱의 상태가 바뀌는 것을 UIKit에서 delegate object 의 메서드를 호출해서 우리에게 알려준다!
근데 iOS 버전에 따라서 확인하는 곳이 다르다.
버전에 따라서 왜 달라지는 걸까?
원래의 App Delegate는 2개의 역할을 가지고 있었다.
이 두가지의 역할을 하나의 앱이, 하나의 프로세스와, 하나의 유저 인터페이스 객체만을 가지고 있던 iOS 12이전까지는 괜찮았다!
근데, 이런 방식은 13부터는 유효하지 않다.
일단 App Delegate와 Scene Delegate라는 두개의 Delegate로 나눠지게 됐다.
App Delegate는 Process Lifecycle의 역할을 그대로 유지하지만, UI 관련 작업을 하지 않게 됐다.
대신 Scene Delegate가 UI Lifecycle을 관리하게 됐다.
왜 이렇게 나눠졌을까? (왜! 왜 나눠!)
이렇게 하나의 앱이, 하나의 프로세스를 사용하기는 하지만, 여러개의 UI 객체나 여러개의 Scene Session들을 가지기 시작했기 때문이다.
이말이 뭔 말이냐, 멀티 윈도우를 지원하기 시작했다라는 말이다.
iOS 12 까지는 하나의 앱에 하나의 창을 키는것만 가능했지만, iOS 13부터는 window의 개념이 scene이라는 개념으로 바뀌고 위 그림처럼 하나의 앱에서 여러개의 scene을 가질 수 있게 됐다.
즉, 하나의 앱에서 여러개의 화면(앱)을 키는 것이 가능해졌다라는 것이다!
그래서 여러가지로 이름과 기반이 달라졌긴 한데,
오늘은 iOS 12 이하 버전에서 사용했던 ApplicationDelegate에 대해 알아보겠다.
먼저 초기 UI를 구성하고 필요한 데이터를 로드하는 함수들이 필요할 것이다.
delegate에게 프로세스가 시작됐지만 state restoration은 아직 발생하지 않았다고 알려준다.
state restoration은 앱이 종료되고 다시 시작될 때 이전에 보존된 데이터를 통해서 view 및 view controller를 재구성해서 이전 상태로 돌아가도록 도와주는 작업을 말한다.
여기서 프로그램을 초기화 하고 실행할 준비를 한다. 이때 앱은 InActive 상태이다.
delegate에게 프로세스 실행이 거의 완료 됐으며, 앱 실행준비가 거의 완료 됐다고 알려준다.
여기서 앱의 초기화를 완료하고 최종 변경을 수행한다.
그리고 state restoration (상태 재구성) 이 발생했지만, 앱의 윈도우와 다른 UI가 표시 되기 전에 호출한다.
마지막으로 시스템은 다른 app delegate의 메서드를 호출하여서 앱을 Active 상태 또는 Background 상태로 이동시켜준다.
이제 초기화도 끝났으니, 상태에 대해 사용하는 메서드들에 대해 알아보자.
이렇게 5개의 상태를 정의할 수 있는 메서드들이 존재한다.
applicationWillEnterForeground(_:)
applicationDidBecomeActive(_:)
를 뒤 이어서 호출하게 된다.applicationDidBecomeActive(_:)
applicationWillResignActive(_:)
applicationDidEnterBackground(_:)
마지막 스냅샷은 실제 앱 구동을 보고 알 수 있는데,
이렇게 Background 상태로 들어가면 스냅샷이 바뀌게 된다.
카카오 뱅크의 경우, 개인정보 유출의 우려가 있기 때문에 Background로 이동했을 시 블러처리를 하는 모습이다.
applicationWillTerminate(_:)
오늘은 iOS 12 이하 버전에서 사용했던 App Life-Cycle 에 대해 알아보았다.
다음 글은 iOS 13이상 버전부터 사용하는 SceneDelegate에 대해 작성해보고,
위 코드들이 실제 폰에서 어떻게 돌아가는지에 대한 글을 작성해보겠다.
감사합니다.