[iOS] App Life Cycle

정한별·2024년 1월 21일
0

iOS

목록 보기
2/2

(항상 잘못된 정보가 포함되어 있을수 있습니다)

(잘못된 정보가 있다면 댓글로 피드백 부탁드리겠습니다)

App Life Cycle

iOS앱은 수명주기 동안 몇가지 상태를 거친다.
앱은 활성화되어 사용자의 이벤트에 반응하거나,
백그라운드에서 음악을 플레이 하거나,
사용자나 OS에 의해 종료될 수 도있다.

상태

  • Not Running
    앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태를 나타낸다.
    이 상태에서 앱은 아무것도 처리할 수 없다.

  • Inactive
    앱이 전면에서 실행중이만 아무런 이벤트를 받지 않는 상태를 나타낸다.
    예를들어 앱이 실행중에 전화가 온다거나 하는 상태이다.
    이 상태는 앱이 다른 상태로 넘어가기전에 항상 거치는 상태이다.
    not running -> inactive -> active
    active -> inactive -> background
    backgorund -> inactive -> active

  • Active
    앱이 전면에서 실행중이며, 이벤트를 받는 상태이다.

  • Background
    앱이 백그라운드에 있지만 여전히 코드를 실행중인 상태이다.
    사용자는 다른앱을 사용하고 있을수도 있지만 우리앱은 어떠한 행동을 할 수 있다.
    다운로드나, 업로드, 연산처리 등

  • Suspended
    앱이 백그라운드에 있고 메모리에 유지되지만 코드는 실행되지 않는 상태이다.
    메모리가 부족해지는 상황이 오면 OS 시스템은 메모리 공간을 확보하기위해 이 상태에 있는 앱들을 특별한 알림없이 정리한다.

App base life cycle


(출처: https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle)

iOS 12 이전 버전의 앱들은
Scene을 지원하지 않기때문에 UIkit의 모든 수명주기 이벤트는 AppDelegate로 위임되어 전달 된다.

  • Not Running -> InActive 넘아기기전
    application:willFinishLaunchingWithOptions
    앱 시작시 코드를 실행할수 있는 가장 처음 기회
    라이프 사이클중 딱 한번 호출될수 있는 녀석이다.

  • Not Running -> InActive 넘어가고 나서
    application:didFinishLaunchingWithOptions
    사용자에게 나타나기 전 최종 단계
    라이프 사이클중 딱 한번 호출될수 있는 녀석이다.

이 두 단계 에서는
앱설정, 초기View 세팅(로그인 하지않은경우 로그인페이지), Apple 푸시 알림 등록
등등 코드를 작성하는것이 가능하다.

  • InActive -> Active
    applicationDidBecomeActive
    앱이 InActive에서 Aactive로 전환
    라이프 사이클중 여러번 호출될수 있는 녀석이다.

  • Active -> InActive
    applicationWillResignActive
    Active에서 Inactive로 전환
    라이프 사이클중 여러번 호출될수 있는 녀석이다.

  • InActive -> Background
    applicationDidEnterBackground
    InActive에서 Background로 전환
    라이프 사이클중 여러번 호출될수 있는 녀석이다.

  • Background -> InActive
    applicationWillEnterForeground
    Background 에서 Inactive로 전환
    라이프 사이클중 여러번 호출될수 있는 녀석이다.

  • 사용자에 의해서 종료될때 (시스템에 의해서 종료될때는 X, 크래시 같은거)
    applicationWillTerminate(_:)

Scene base life cycle

iOS 13버전 이후 생긴 Scene이라는 개념 이후 생긴 라이프 사이클

Scene

iOS 12까진 하나의 앱이 하나의 프로세스와 하나의 앱UI객체만을 가지고 있었는데
iOS 13이후에 하나의 앱이 하나의 프로세스와 여러 앱UI객체를 가질수 있게 되었다.
그때 생겨난것이 바로 Scene이라는 개념이다.

기존에 모든 책임을 AppDelegate가 가지고 있었지만

이 책임을
AppDelegate와 SceneDelegate로 나눠서 관리하게 되었다.

이로인해 하나의 앱에서 여러개의 창을 사용할수 있게 되었다.

AppDelegate

AppDelegate는 앱이 실행할때 한번만 생성된다.

  • Not Running -> InActive 넘아기기전
    application:willFinishLaunchingWithOptions
    앱 시작시 코드를 실행할수 있는 가장 처음 기회
    라이프 사이클중 딱 한번 호출될수 있는 녀석이다.

  • Not Running -> InActive 넘어가고 나서
    application:didFinishLaunchingWithOptions
    사용자에게 나타나기 전 최종 단계
    라이프 사이클중 딱 한번 호출될수 있는 녀석이다.

  • 사용자에 의해서 종료될때 (시스템에 의해서 종료될때는 X, 크래시 같은거)
    applicationWillTerminate(_:)

위에 3개는 기존 AppDelegate도 동일

  • Scene 생성
    application(_:configurationForConnecting:options:)
    Scene의 Configuration을 설정 가능
    새로운 Scene이 생성될때 마다 호출

  • Scene 연결 해제
    func application (_ : didDiscardSceneSessions :)
    Scene이 사용자의 의해 수동적으로 영구적으로 해제될때만 이 메서드가 호출된다.
    Scene이 bacgkround로 들어간뒤에 메모리를 확보하기위할때는 Scene객체를 삭제하지만 세션은 유지하기때문에 호출되지 않는다.

SceneDelegate

SceneDelegate는 Scene이 생성될때마다 새로운 인스턴스가 생성된다.

  • Scene 연결
    scene(_:willConnectTo:options:)
    Scene이 앱에 연결되고 데이터 로드를 시작하면 이 메서드가 호출된다.

  • bacgkround -> foreground
    sceneWillEnterForeground
    완전한 백그라운드에서 포그라운드 왔을때 호출
    1초만에 백그라운드로 갔다 다시 오는경우 호출이 안됨
    앱 첫실행시에는 반드시 실행

  • active
    sceneWillResignActive
    active상태가 될때마다 실행
    바로 위에 sceneWillEnterForeground는 호출 되지 않아도 이 상태는 호출 되는 경우도 있음 (나갔다 바로 들어오기)

  • resign active
    sceneWillResignActive
    active 상태를 벗어날때 호출
    바로 아래 sceneDidEnterBackground가 호출 되지 않아도 이 상태는 호출 되는 경우도 있음 (나갔다 바로 들어오기)

  • foreground -> background
    sceneDidEnterBackground
    완전한 백그라운드 상태가 되었을때 호출
    1초반에 백그라운드로 갔다 다시 오는경우 호출이 안됨
    수동으로 앱 종료시에도 호출이 안됨

  • Scene 종료
    sceneDidDisconnect
    앱을 수동으로 종료하는 경우에만 호출
    Scene이 bacgkround로 들어간뒤에 메모리를 확보하기위할때 Scene 객체를 삭제하는데 이때도 호출된다.

profile
iOS Developer

0개의 댓글