Swift. AppLifeCycle - AppState

Choooose·2023년 3월 7일
0

Swift

목록 보기
2/5

App Life Cycle 이란 ?


앱의 실행/종료 및 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태가 전환되는 과정을 의미한다.

앱의 현재 상태에 따라서 수행할 수 있는 작업과 수행할 수 없는 작업이 결정된다.

예를 들어 foreground 상태에서는 앱이 화면에 표시되고 있고 사용자가 직접 사용하고 있는 상황이므로 CPU를 포함한 시스템 리소스의 우선순위가 높다.

그러나 background 상태에서는 앱이 화면에 표시되고 있는 상황이 아니기 때문에 가능한 적은 작업을 수행해야 한다.

App State


앱의 상태는 총 다섯가지로 구분할 수 있다.

Not running

앱이 실행되지 않았거나, 시스템에 의해 종료된 상태이다.

Inactive

앱이 실행 중이지만 사용자로부터 이벤트를 받을 수 없는 상태이다.
앱이 실행되던 중에 알림, 전화 등으로 인해서 앱을 사용할 수 없는 경우 Inactive 상태로 들어간다.

Active

앱이 실행 중이고 사용자로부터 이벤트를 받을 수 있는 상태
버튼을 누르거나 뒤로 스와이프를 하는 등의 사용자가 앱과 상호작용하는 상태이다.

Background

홈화면으로 나가거나 다른 앱을 실행하여 실질적으로 앱이 동작하지 않는 상태
그렇지만 필요한 코드는 돌아가고 있는 상태이다.
음악을 듣거나 네트워크 서비스, 알림이 오는 경우 등의 적은 작업은 Background 상태에서도 가능하다.

구체적으로 Background에서도 돌아가는 작업들은

  1. Audio, AirPlay and Picture in Picture
	a. 오디오, AirPlay 등의 작업과 Picture in Picture ( pip 동영상 서비스 ) 는 백그라운드 상태에서도 가능하다.
  1. 위치 기반 서비스
	a. 지도 등의 위치를 활용하는 서비스
  1. Voice over IP (VoIP)
	a. Zoom, 카카오 보이스톡 등의 인터넷을 활용하는 전화 서비스
  1. 외부 악세서리와의 통신
  2. Bluetooth LE 액세서리와의 통신
  3. 정기적으로 서버에서 업데이트를 받아오는 행위
  4. APN (애플 푸쉬 알림 서비스) 지원

이 있다.

이 밖에도 Background 상태로 들어가면서 선행되어야하는 작업들이 있다.

  1. 공유 리소스 해제
    1. 앱이 Background 상태로 들어가게 되면 메모리의 확보가 특히 중요하다.
      예를 들어 A앱이 Background 상태로 들어가고 B앱이 Foreground로 올라오게 되면 메모리와 기타 시스템 리소스는 당연히 사용자가 현재 사용중인 B앱의 우선순위가 높아야한다.

      따라서 Background 상태로 앱이 들어가면 공유 리소스를 해제하여 가능한 적은 리소스와 메모리를 갖도록 한다.

    2. 이때 메모리 확보를 위해 중단하는 항목은 아래와 같다.

      1. 사용자 데이터를 디스크에 저장하고 열려있는 파일을 모두 종료한다.
      2. dispatch 와 오퍼레이션 큐 ( 작업 대기열 ) 을 중단한다.
      3. 새로운 작업을 시행하지 않도록 한다.
      4. 게임 앱의 경우 자동적으로 게임을 중단한다.
      5. Metal 프레임워크의 새로운 작업이 진행되지 않는다.
        (Metal 프레임워크는 GPU 가속 3D그래픽용 자체 API라고 할 수 있다.)
      6. openGL의 새로운 작업이 진행되지 않는다.

      Foreground 상태로 진입할때는 다시 재개한다.

  2. SnapShot
    1. 흔히 멀티태스킹 화면에 들어가면 볼 수 있는 상태이다.
      SnapShot는 멀티태스킹 화면 말고도 앱이 다시 Foreground 상태로 진입할 때 일시적으로 표시하는 역할을 한다.
    2. SnapShot 을 만들때는 사용자의 민감한 정보 (비밀번호, 개인정보) 가 표시되지 않도록한다.
      하단의 스크린샷 예시를 보면 카카오톡의 경우 사용자의 개인정보가 있을 수 있으므로 현재 상태 그대로를 SnapShot으로 만드는 것이 아닌 암호를 입력하는 창으로 만들어 보호한다.

Suspended

앱이 종료되었지만 다시 실행하는 경우 최근 작업을 빠르게 로드하기 위해서 필요한 메모리만 저장되어 있는 상태, Suspended에서는 코드가 따로 돌아가지 않는다.
Background에서 Suspended로의 전환은 개발과정에서는 테스트 할 수 있지만 일반 사용자는 알 수 없다.

Background와 Suspended의 차이

Background 상태에서 돌아갈 작업이 없다면 2~3초 뒤에 Suspended 상태로 들어가게 되는데 Suspended 상태의 앱을 실행 하였을때 Background 처럼 실행중이던 상태 그대로 복구하는 것이 아닌 필요한 최소한의 메모리만 저장해놓은 상태로 NotRunning 보다는 빠르게 앱을 실행하게 된다.

또한 Suspended 상태도 앱이 실행을 하지는 않지만 메모리를 저장하고 있기 때문에 어느정도 메모리 공간을 차지한다. 따라서 따라서 메모리 공간이 부족해지면 Suspended 상태의 앱을 시스템에서 자체적으로 종료시키게 된다.

이 앱을 실행하면 NotRunning 상태에서 앱이 실행되는 것이므로 앱을 처음 실행하는 것과 같다.

멀티 태스킹 환경에서의 앱 상태

AppLifeCycle에서 가장 의문이 들었고 심도있게 공부한 부분이다.

SnapShot을 찍는 이유가 처음에는 Background 상태에서의 앱을 다시 불러오기 위한 작업인데 그렇다면 멀티 태스킹 환경에서의 앱 상태는 Background 상태인가 ?

라는 의문에서 출발했던 부분이다.

그렇지만 멀티 태스킹 환경에서 다시 앱을 실행하게 되었을때 기존 Background로 들어가기 전의 상태를 불러오지 못하는 앱들이 있었고 또한 멀티 태스킹 환경의 SnapShot들이 기기의 재부팅에도 유지가 되었기 때문에 더더욱 혼란이 왔었다.

결론은 앞서 나왔던 SnapShot을 보여주는 멀티태스킹 화면은 앱의 상태와는 관계없이 사용자의 인터페이스를 위해 최근 사용했던 앱의 SnapShot을 보여주는 화면이었다.

또한 정확하지는 않지만 추측하기로는 멀티 태스킹 환경에서의 SnapShot들은 보조기억장치에 저장되는 것 같다. 주기억장치에 저장되는 경우에는 기기를 재부팅하면 삭제되기 때문에 ..

따라서 멀티태스킹 화면에는 최근 실행된 앱이라면 그 상태에 상관없이 보여지게 된다.
이렇게 보면 멀티 태스킹 화면에 있는 앱들은 Background, Suspended, NotRunning 중 하나의 상태인 앱이라고 봐도 될 것 같다.

위처럼 앱의 상태가 바뀔때 UIKit은 적절한 delegate object의 메소드를 호출하여 사용자에게 상태에 따른 정보를 제공한다.

AppDelegate과 SceneDelegate는 다음 포스팅에서 다룰 예정이다.

0개의 댓글