Search
Duplicate

앱이 In-Active 상태가 되는 시나리오

Created
2023/10/12 12:36
Tags
iOS
태그

 면접 질문 : 앱이 In-Active 상태가 되는 시나리오

 iOS Application 상태 변화들

 앱의 상태 변화

Not running (Unattached)

앱이 실행되지 않았거나 시스템에서 종료된다.
application(_willFinishLaunchingWithOptions)
앱 실행을 준비하는 메소드
applicationDidFinishLaunching(_:)
주로 초기화 코드
applicationWillTerminate(_:)
앱이 종료되기 직전에 호출

Foreground

In-Active
앱이 Foreground에서 실행 중이지만, 이벤트를 받을 수 없다 → 이 상태에 잠시 머물다가 다른 상태로 전이된다.
sceneWillEnterForeground(_:)
앱이 백그라운드나 not running에서 foreground로 들어가기 직전에 호출된다.
Active
앱이 화면에 떠 있을 때의 상태 → 이벤트를 받을 수 있다
sceneWillResignActive(_:)
앱이 비활성 상태에서 활성 상태로 진입하고 난 직후

Background

앱이 백그라운드에서 코드를 실행 중이다.
대부분의 앱은 일시중지 상태로 잠시 이 상태가 된다.
그러나 추가 시간을 요청하는 앱은 일정기간 동안 이 상태로 남아있을 수 있다.
또한 백그라운드로 직접 실행되는 앱은 비활성 상태 대신 이 상태로 전환된다.
sceneDidEnterBackground(_:)
앱이 백그라운드 상태로 들어갔을 때

Suspended

앱이 백그라운드에 있지만 코드를 실행하지 않는다.
시스템은 앱을 자동으로 이 상태로 이동시키고 그렇게 하기 전에 앱에 알리지 않는다.
일시중지 된 앱은 메모리에 남아는 있지만 코드는 실행되지 않는다.
메모리 부족 상태가 발생하면 시스템은 예고없이 일시 중단 된 앱을 제거하여 메모리를 확보한다.
따로 호출되는 메소드는 없다.
사용자나 시스템이 새로운 scene을 만들어달라고 요청하면, UIKit은 이를 만들어 unattached 상태로 만든다.
사용자가 요청한 scene은 곧장 Foreground Inactive 상태를 거쳐 active 상태가 되고, 시스템이 요청한 scene은 보통 Background 상태가 되어 이벤트르 처리한 뒤에 Foreground로 올라온다.
사용자가 앱의 UI를 닫게 되면, 해당하는 scene은 UIKit에 의해 Background 상태로 갔다가 Suspended 상태가 된다.
UIKit은 언제든지 이 Background나 Suspended 상태인 scene을 회수해 unattached 상태로 되돌려 놓을 수 있다.

 View Controller Life Cycle

1.
main 함수 실행
2.
main 함수는 UIApplicationMain 함수를 호출
3.
UIApplicationMain 함수는 앱의 본체에 해당하는 객체인 UIApplication 객체를 생성
4.
nib 파일을 사용하는 경우나, Info.plist 파일을 읽어들여 파일에 기록된 정보를 참고해 그 외에 필요한 데이터를 로드
5.
App Delegate 객체를 만들고, 앱 객체와 연결해 Main을 만드는 등 실행에 필요한 준비
6.
실행 완료를 앞두고 앱 객체가 App Delegate에게 application:didFinishLaunchingWithOptions: 메세지를 보냄

 앱이 In-Active 상태가 되는 시나리오?

1.
사용자가 앱을 실행한다: Not Running → In-Active → Active
2.
앱 실행 도중 홈 버튼을 누른다: Active → In-Active → Background
3.
앱을 다시 켠다: Background → In-Active → Active
4.
앱이 백그라운드에 있다가 Suspended 상태로 전이: Active → In-Active → Background → Suspended

메소드 순서

1.
Not Running에서 앱 실행하고 Foreground 직전에 applicationDidFinishLaunching(_:) 이 호출된다.
2.
이제 Foreground에 진입할 때 sceneWillEnterForeground(_:) 가 호출되면서 In-Active 상태가 된다.
3.
또한 유저가 백그라운드에 진입했을 때, sceneDidEnterBackground(_:) 가 호출 된다.
4.
다시 Foreground에 들어가게 될 때, sceneDidBecomeActive(_:) 이 호출되는데, 여기서 In-Active 상태를 거쳐가게 된다.

Reference