iOS App Life Cycle 알아보기 [iOS 12 이하 버전]

Tabber·2021년 12월 9일
0

iOS Review

목록 보기
1/15
post-thumbnail

공부하며 적은 글입니다! 내용이 정확하지 않을 수 있습니다.

들어가기 전

보통 앱을 만들기 시작하고 진행을 할 때 앱의 생태주기, 그러니까 앱이 어느 시점에 켜지고, 꺼지고, 대기하고 등등을 잘 모른다. 나도 잘 모르고 있는 상태이기도 하다.

따라서 이 부분을 오늘 한번 제대로 알아보고자 한다!

아니 앱은 그냥 실행 되면 끝나는거 아냐?

아니다. 진짜 아니다. 다음 상황을 생각 해보자.

넷플릭스를 보고 있는 XXX(23세) 는 갑자기 온 친구의 카톡에 답장을 하기 위해 잠시 카톡을 들어가서 답장을 하고 왔다. 근데? 앱 라이프 사이클이 잘못 작동하여 보고 있던게 초기화 되고 다시 앱이 실행이 됐다.

아..🥲상황만 들어도 짜증난다.
이렇게 상황을 나눠서 구현한다면, 이러한 상황을 극복할 수 있다!

App Life Cycle

앱의 동작은 크게 다섯가지로 표현할 수 있다.

  • Not Running
    앱이 실행되지 않은 상태
  • Inactive (foreground)
    앱이 지금 foreground 에서 실행 중 이지만, 앱에 대한 이벤트는 현재 받지 못하는 상태. Active 상태로 넘어가기 전에 무조건 이 상태를 거친다.
  • Active (foreground)
    앱이 실행 중이고, 이벤트를 받을 수 있는 상태
  • background
    앱 사용 중에 다른 앱을 실행한다거나, 홈 화면을 나갔을 때의 상태. background 에서 동작하는 코드를 추가하면 suspend 상태로 넘어가지 않고, background 상태를 유지한다. (예를 들자면, 음악 플레이어 백그라운드 재생 같은 것!)
  • Suspended
    앱이 background 상태에서 추가적인 작업을 하지 않는다면, 곧바로 suspend 상태로 진입. 코드는 실행되지 않으면서 앱을 다시 실행할 때는 빠른 실행을 위해서 메모리에만 올라가 있다. 만약에 메모리가 부족한 상황이면 suspend 상태의 앱 메모리를 해제.

그럼 어디서 사용해?

앱의 상태가 바뀌는 것을 UIKit에서 delegate object 의 메서드를 호출해서 우리에게 알려준다!

근데 iOS 버전에 따라서 확인하는 곳이 다르다.

  • iOS 12 이하
    UIApplicationDelegate 개체를 사용하여 접근한다.
  • iOS 13 이상
    UISceneDelegate 개체를 사용하여 접근한다.

버전에 따라서 왜 달라지는 걸까?

아니 왜 두개로 나눠짐?

iOS 12 이전

원래의 App Delegate2개의 역할을 가지고 있었다.

  1. Process Lifecycle
    Process 수준에서 이벤트를 알려준다. 그래서 시스템은 AppDelegate에게 Process가 실행상태인지, 아닌지의 정보를 알려준다.
  1. UILifecycle
    App UI의 상태(State)를 알려준다. 메서드를 통해서 UI의 상태를 알려주게 된다.

이 두가지의 역할을 하나의 앱이, 하나의 프로세스와, 하나의 유저 인터페이스 객체만을 가지고 있던 iOS 12이전까지는 괜찮았다!

iOS 13 이후

근데, 이런 방식은 13부터는 유효하지 않다.

일단 App DelegateScene Delegate라는 두개의 Delegate로 나눠지게 됐다.

App Delegate는 Process Lifecycle의 역할을 그대로 유지하지만, UI 관련 작업을 하지 않게 됐다.

대신 Scene DelegateUI Lifecycle을 관리하게 됐다.

왜 이렇게 나눠졌을까? (왜! 왜 나눠!)

이렇게 하나의 앱이, 하나의 프로세스를 사용하기는 하지만, 여러개의 UI 객체여러개의 Scene Session들을 가지기 시작했기 때문이다.

이말이 뭔 말이냐, 멀티 윈도우를 지원하기 시작했다라는 말이다.

iOS 12 까지는 하나의 앱에 하나의 창을 키는것만 가능했지만, iOS 13부터는 window의 개념scene이라는 개념으로 바뀌고 위 그림처럼 하나의 앱에서 여러개의 scene을 가질 수 있게 됐다.

즉, 하나의 앱에서 여러개의 화면(앱)을 키는 것이 가능해졌다라는 것이다!

그래서 여러가지로 이름과 기반이 달라졌긴 한데,
오늘은 iOS 12 이하 버전에서 사용했던 ApplicationDelegate에 대해 알아보겠다.

Respond to App-Based Life-Cycle Events

먼저 초기 UI를 구성하고 필요한 데이터를 로드하는 함수들이 필요할 것이다.

application(_:willFinishLaunchingWithOptions:)

delegate에게 프로세스가 시작됐지만 state restoration은 아직 발생하지 않았다고 알려준다.

state restoration은 앱이 종료되고 다시 시작될 때 이전에 보존된 데이터를 통해서 view 및 view controller를 재구성해서 이전 상태로 돌아가도록 도와주는 작업을 말한다.

여기서 프로그램을 초기화 하고 실행할 준비를 한다. 이때 앱은 InActive 상태이다.

application(_:didFinishLaunchingWithOptions:)

delegate에게 프로세스 실행이 거의 완료 됐으며, 앱 실행준비가 거의 완료 됐다고 알려준다.

여기서 앱의 초기화를 완료하고 최종 변경을 수행한다.
그리고 state restoration (상태 재구성) 이 발생했지만, 앱의 윈도우와 다른 UI가 표시 되기 전에 호출한다.
마지막으로 시스템은 다른 app delegate의 메서드를 호출하여서 앱을 Active 상태 또는 Background 상태로 이동시켜준다.

App Life-Cycle Events

이제 초기화도 끝났으니, 상태에 대해 사용하는 메서드들에 대해 알아보자.

이렇게 5개의 상태를 정의할 수 있는 메서드들이 존재한다.

applicationWillEnterForeground(_:)

  • 앱이 Background 에서 foreground로 진입할 것이라는 것을 delegate에게 알려준다.
  • Background 상태였던 앱이 InActive 상태로 진입하게 된다.
  • 언제나 앱을 InActive 상태에서 Active 상태로 이동시키는 applicationDidBecomeActive(_:) 를 뒤 이어서 호출하게 된다.

applicationDidBecomeActive(_:)

  • 앱이 InActive 상태에서 Active 상태로 이동했다라는 것을 delegate에게 알려준다.
  • 앱은 사용자나 시스템에 따라서 Active 상태가 될 수도 있지만, InActive 상태(전화 수신이나 카톡)로 만드는 인터럽트무시해 Active 상태로 되돌아갈 수 있다.
  • 여기서 앱이 InActive 상태였을 동안 일시 중지됐던 작업들을 재개한다.

applicationWillResignActive(_:)

  • 앱을 Active 상태에서 InActive 상태로 이동한다는 것을 delegate에게 알려준다.
  • 앱을 Background 상태로 전환하기 시작할 때나, 전화를 받거나 카톡을 하는 인터럽트로 인해 InActive 상태로 전환될 수 있다.
  • 여기서 타이머 비활성화, 게임 일시 중지 등 진행 중인 작업을 중단하고, 사용자의 테이터를 저장할 수 있다.

applicationDidEnterBackground(_:)

  • 앱이 Background 상태에 있음을 delegate에게 알려준다.
  • 앱은 여러 이유들로 Background 상태로 이동하게 된다.
  • 앱이 Background에 있을 때는 가능한 적은 일을 수행해야 한다. (왠만하면 아무것도 안하는게 좋음 ㅎ)
  • 앱의 상태 정보를 저장해서 나중에 앱이 종료되는 경우, 앱을 현재 상태로 복원할 수 있다.
  • 앱이 Background로 들어가고 delegate 메서드가 반환되면 UIKit은 앱의 사용자 인터페이스의 스냅샷을 만든다.

마지막 스냅샷은 실제 앱 구동을 보고 알 수 있는데,

이렇게 Background 상태로 들어가면 스냅샷이 바뀌게 된다.
카카오 뱅크의 경우, 개인정보 유출의 우려가 있기 때문에 Background로 이동했을 시 블러처리를 하는 모습이다.

applicationWillTerminate(_:)

  • 앱이 종료될 시기를 delegate에게 알려준다.
  • 이를 통해서 앱이 메모리에서 완전히 종료 및 제거 될 것임을 알 수 있다.
  • 최종 정리 작업을 이 메서드에서 작업한다.

정리

오늘은 iOS 12 이하 버전에서 사용했던 App Life-Cycle 에 대해 알아보았다.
다음 글은 iOS 13이상 버전부터 사용하는 SceneDelegate에 대해 작성해보고,
위 코드들이 실제 폰에서 어떻게 돌아가는지에 대한 글을 작성해보겠다.

감사합니다.

profile
iOS 정복중인 Tabber 입니다.

0개의 댓글