[iOS]SwiftUI App의 라이프사이클 #1 iOS App의 라이프사이클

Eric·2022년 11월 12일
0
post-thumbnail

도입부

아이패드 Playground에서 프로젝트를 만들면 ContentView 말고도 MyApp이라는 Swift 파일이 항상 같이 생성됩니다. 파일에 작성된 코드를 보면 평소에 보던 ContentView와 비슷한 듯하면서도 다른 모습을 볼 수 있습니다.

//MyApp.Swift

import SwiftUI

@main
struct MyApp: App {
	var body: some Scene {
    	WindowGroup {
        	ContentView()
        }
    }
}
//ContentView.Swift

import SwiftUI

struct ContentView: View {
	var body: some View {
    	ㆍㆍㆍ
    }
}

코드 짤 때는 한번도 못 본 @main, App, Scene, WindowGroup 같은 것들이 보이네요..
이 것들은 모두 SwiftUI 앱의 생명주기(Lifecycle)와 관련이 있습니다.

이번 포스팅에서는 이를 알아보기 전에 먼저 iOS 앱의 생명주기를 먼저 알아보겠습니다.

생명주기(Life cycle)?

iOS 앱의 생명주기란 앱이 아이폰의 디바이스에서 실행되고 사용되며 종료되기까지의 과정입니다.
iOS 앱의 생명주기는 크게 3가지로 분류할 수 있습니다.

  1. Not Running: 앱이 실행되고 있지 않은 상태
  2. Foreground: 앱이 실행되어 화면을 차지하고 있는 상태
  3. background: 앱이 메모리를 차지하고 있지만 화면을 차지하지 않는 상태

Foreground는 ActiveInactive로, background는 RunningSuspend 상태로 구분할 수 있습니다..

Active 상태는 앱이 화면을 차지하고 있으면서, 사용자가 앱을 Full Control할 수 있는 상태를 말합니다.
Inactive 상태는 외부적인 방해에 의해서 사용자가 앱을 Full Control할 수 없는 상태를 말합니다.

ActiveInactive에게 감싸져 있는게 보이시나요?
Active 상태가 되거나 벗어날 때는 Inactive 상태를 반드시 거쳐야함을 의미합니다.
텍스트로만 설명하면 이해가 어려울 수 있으니 제가 지금 글쓰면서 사용하고있는 Youtube Music 앱을 예시로 설명해보겠습니다.

#Not Running -> Inactive -> Active

Youtube Music 앱이 Not Running 상태에서 Inactive 상태를 거쳐 Active 상태가 되었습니다.
Active 상태에는 이렇게 앱을 Full Control(앨범을 누르고, 노래를 재생) 할 수 있습니다.

위처럼 Active 상태가 되기위해서는 반드시 Inactive를 거쳐야 합니다.

#Active -> Inactive

유튜브 뮤직이 외부의 방해(사용자의 제스처로 앱 스위처로 이동)를 받아 Active에서 Inactive 상태가 되었습니다. 이 때는 어느정도 화면을 차지하고 있지만, 앱을 Full Control하지 못합니다.

#Active -> Inactive -> Running

이번엔 노래를 재생한 채로 제스처를 통해 유튜브 뮤직을 백그라운드로 보냈습니다.
앱의 상태는 Active 에서 Inactive를 거쳐 Running 상태가 되었습니다. Running 상태에서는 화면을 차지하지 않더라도 백그라운드에서 계속 작업을 수행하고 있습니다. 다이나믹 아일랜드에서 노래가 계속 재생되고 있는걸 확인할 수 있습니다. 깨알 다이나믹 아일랜드 자랑(ㅋㅋ)할랫는데 사진 깨졋네 ㅡㅡ

#Running -> Not Running(Timeout)

하지만 iOS에서는 보안상의 이유로 백그라운드에서 앱이 오랫동안 돌아가는걸 지양하고 있습니다. 그래서 앱이 백그라운드에서 작업을 정해진 시간 내에 완료하지 못하면, Timeout 함수를 호출하여 하던 작업을 정리하고, Not Running 상태가 됩니다.

#Running -> Suspend

만약 정해진 시간 내에 작업을 완료하면 Running 상태에서 Suspend 상태가 됩니다.

#Active -> InActive -> Suspend

노래를 정지하고 백그라운드로 보내 앱이 Active 에서 Inactive 를 거쳐 Suspend 상태가 되었습니다. 이 때 앱은 메모리에서 아무 행동을 하지 않으면서 사용자가 앱을 다시 실행할 때까지 계속 대기합니다.

#Suspend -> Not Running(메모리 부족)

Suspend 상태에서 메모리의 용량이 부족해지면 OS의 결정에 따라 앱이 메모리에서 내려가 Not Running가 됩니다.

그리고 그림에 화살표로 표시되고 있진 않지만, Running에서 Not Running이 되거나, Inactive에서 Not Running상태가 되는 것도 가능합니다.(앱 스위처에서 드래그 제스처로 종료)

저희가 일상에서 쓰고있는 앱들은 매번 이런 과정들을 거칩니다.
Safari를 백그라운드로 내려도 다운이 멈추지 않고,
게임을 하다가 중간에 전화를 받아도 다시 그 전 게임 화면으로 돌아올 수 있는 것도 다 앱들이 이런 과정을 거치기 때문이겠죠.

이 말을 다르게 하면, 저희가 만들 앱들 역시 이런 상태에 대한 반응을 다룰 수 있음을 의미합니다.
다음 포스팅에서 SwiftUI App의 Life Cycle에 대해 다루겠습니다.

참고

스위프트 하이: 개발자 교양필수 : iOS 앱의 라이프사이클. iOS 앱이 실행 된 후 종료하기까지 거치는 변화. 개발자만이 아니라 기획자 디자이너도 알아야 하는 앱 상식

profile
IOS Developer DreamTree

0개의 댓글