티스토리 뷰
iOS 면접 준비를 위한 2탄이다. iOS 앱의 생명주기에 대해 알아보자.
- 아래 링크 참고
iOS 앱의 Life Cycle
1️⃣ iOS 앱의 생명주기에 대해 설명해주세요.
앱의 생명주기란 앱의 실행/종료 및 앱이 Foreground/Background에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태과 전환되는 일련의 과정을 뜻합니다.
iOS 앱의 생명주기는 5개의 상태로 구분할 수 있지만, iOS 12 및 이전 버전은 AppDelegate를 iOS 13 및 이후 버전은 SceneDelegate로 처리합니다.
- Not Running
- Foreground - Inactive
- Foreground - Active
- Background - Running
- Background - Suspended
✏️ 설명
생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻합니다.
2️⃣ 앱의 각 상태(Not Runnig, lnactive, Active, Background, Suspended)에서 할 수 있는 작업은 무엇인가요?
1. Not Running
: 앱이 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태입니다. 이 상태에서는 아무런 코드도 실행되지 않습니다.
2. Foreground - Inactive
: 앱이 실행 중이지만, 이벤트를 받지 않거나 처리할 수 없는 상태입니다. 예를 들어, 앱이 전화 중이거나 다른 앱에서 알림 창이 열려 있는 경우에 해당합니다.
3. Foreground - Active
: 앱이 전면에 표시되고, 사용자 이벤트를 수신하고 있으며, 실행 중인 상태입니다. 바로 Active 상태로 갈 수 없으며 Inactive 상태를 거친 후 Active 상태로 갈 수 있습니다.
4. Background - Running
: 앱이 화면에서 보이지 않지만 여전히 실행 중이고 작업을 수행하고 있는 상태입니다. 백그라운드에서 실행되는 시간은 일반적으로 제한되어 있습니다. 예를 들어, 음악 재생이나 위치 추적과 같은 백그라운드 동작을 할 수 있습니다.
5. Background - Suspended
: 앱이 백그라운드에 있지만 코드가 실행되지 않는 상태입니다. 시스템은 앱을 중단시켜 메모리를 확보하고 배터리를 절약합니다. 앱은 백그라운드 상태에서 중단될 때까지 아무런 코드도 실행하지 않습니다. 하지만 메모리에는 남아 있고, 다시 활성화될 때 이전 상태를 빠르게 복원할 수 있습니다.
3️⃣ 앱 상태 변화에 따라 호출되는 AppDelegate 메서드들을 나열해주세요.
1. application(_:willFinishLaunchingWithOptions:):
앱이 실행되기 직전에 호출, 앱의 초기화를 수행하는 데 사용됩니다.
2. application(_:didFinishLaunchingWithOptions:):
앱이 실행된 직후에 호출, 앱 초기화가 완료되었을 때 실행되며, 앱의 UI를 설정하거나 기타 초기 설정을 수행하는 데 사용됩니다.
3. applicationDidBecomeActive(_:):
앱이 Active 상태로 전환될 때 실행되며, 사용자와 상호작용하기 직전에 수행할 작업을 여기에 추가할 수 있습니다.
4. applicationWillResignActive(_:):
앱이 Inactive 상태로 전환되기 전에 실행되며, 백그라운드로 전환되거나 종료될 때 필요한 작업을 수행할 수 있습니다.
5. applicationDidEnterBackground(_:):
앱이 백그라운드로 전환된 직후에 호출, 앱이 백그라운드 상태로 전환된 후에 실행되며, 백그라운드 동작을 설정하거나 상태를 저장하는 데 사용됩니다.
6. applicationWillEnterForeground(_:):
앱이 전면으로 나타나기 직전에 호출, 앱이 백그라운드에서 전면으로 나타나기 전에 필요한 작업을 수행할 수 있습니다.
7. applicationWillTerminate(_:):
앱이 종료될 때 호출, 앱이 종료되기 전에 필요한 정리 작업을 수행할 수 있습니다.
8. application(_:didReceiveRemoteNotification:fetchCompletionHandler:):
원격 알림을 수신할 때 호출, 이 메서드를 사용하여 원격 알림을 처리하고 필요한 동작을 수행할 수 있습니다.
✏️ 설명
🟡 iOS 12 버전 혹은 이전 버전 => AppDelegate

1️⃣ 앱 실행 => Not Running - Inactive - Active
앱이 실행되면 Not Running에서 Inactive를 거쳐 Active로 상태가 전환된다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청한다.
- 앱이 실행된 직후에 호출, 앱 초기화가 완료되었을 때 실행되며, 앱의 UI를 설정하거나 기타 초기 설정을 수행하는 데 사용됩니다.
application(_:didFinishLaunchingWithOptions:)
- 앱이 Active 상태로 전환될 때 실행되며, 사용자와 상호작용하기 직전에 수행할 작업을 여기에 추가할 수 있습니다.
applicationDidBecomeActive(_:)
2️⃣ 앱 실행 후 홈 화면으로 나가면: Active - inactive - Background(-Suspended)
앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background로 상태가 전환된다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청한다.
- 앱이 Active에서 Inactive 상태로 전환될 때 호출된다.
applicationWillResignActive(_:)
- 앱이 Background 상태로 전환되었을 때 호출된다.
applicationDidEnterBackground(_:)
3️⃣ Background 상태에 있는 앱을 다시 실행하면 : Background - Inactive - Active
Background 상태에 있는 앱을 다시 실행하면 InActive를 거쳐 Active 상태로 전환된다.
이 때, AppDelegate는 시스템에 다음 메소드를 호출하도록 요청한다.
- 앱이 Background에서 Inactive 상태로 전환될 때 호출된다.
applicationWillEnterForeground(_:)
- 앱이 Inactive에서 Active 상태로 전환될 때 호출된다.
applicationDidBecomeActive(_:)
4️⃣ 앱 종료: (Some State) - Background or Suspended - Not Running
사용자가 직접 앱을 종료시키는 경우, 앱은 다시 Not Runnig 상태로 돌아간다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청한다.
- 앱이 사용자에 의해 종료될 때 호출된다. 시스템에 의해 예기치 못한 상황에서 종료될 때는 호출되지 않는다.
applicationWillTerminate(_:)
4️⃣ 백그라운드에서 작업을 완료하기 위한 방법들은 무엇이 있나요?
1. Background Tasks (백그라운드 작업)
iOS는 특정 종류의 백그라운드 작업을 허용한다.
2. Background Modes (백그라운드 모드)
iOS 앱이 백그라운드에서 실행 가능한 기능을 설정하는 옵션이다.
=> Background Modes로 부터 승인된 기능을 Background Tasks API로 구현하는 것이다.
3. Background Fetch (백그라운드 패치)
4. Slient Push Notifications (조용한 푸시 알림)
5. URL Session Background Transfer (URL 세션 백그라운드 전송)
: 앱은 URL 세션을 사용하여 백그라운드에서 데이터를 업로드하거나 다운로드할 수 있다.
✏️ 설명
iOS는 성능 문제로 백그라운드에서 실행되는 앱의 시간을 제한한다고 한다!
제한된 시간안에 작업을 수행하려면 BackgroundTaskAPI를 사용하여 시간 제한을 늘릴 수 있지만, 그래도 제한시간이 지나면 강제로 종료된다고 한다.
🟡 Background Modes 설정
XCode -> Target -> Capabilities -> Background Mode에서 설정할 수 있다.

background Modes에 다양한 옵션이 있는 걸 확인할 수 있다.

- 오디오 재생(Audio, AirPlay and Picture in Picture): 앱은 백그라운드에서 오디오를 재생/녹음을 계속 할 수 있다.
- 위치 업데이트 수신(Location updates): 앱은 디바이스의 위치가 변경됨에 따라 콜백을 계속 받을 수 있다.
- Remote notifications: FCM payload에 “content-available”: true가 포함된 경우 App을 깨워 Event를 처리할 수 있습니다.
- 백그라운드 가져오기(Background Fetch): 주기적으로 백그라운드에서 데이터를 가져오기 위해 사용, 시스템이 지정한 시간 간격에 따라 백그라운드에서 데이터를 가져올 수 있다.
🟡 Background Tasks 설정
백그라운드에서 실행되는 Task를 스케줄링하기 위해, Background Mode를 설정하고 Task를 BGTaskScheduler 객체에 등록해야 한다. Background에 실행시킬 Task를 info.plist에서 설정할 수 있다.
Background Task에는 두 종류가 있다.
- BGAppRefeshTask
: 가벼운 작업, 단순 API 호출 및 저장, 사용자가 기기를 사용하는 시간에도 실행이 가능하다.
- BGProcessingTask
: DB등 크고 무거운 작업, 보통 앱이 충전 중이고 아무것도 안할 때 실행한다.
Background Fetch => BGAppRefresh Task 사용
Background Processing => BGProcessing Task 사용
References
'스위프트' 카테고리의 다른 글
[SwiftUI] - App, Scene, View, WindowGroup 이해 (0) | 2024.04.18 |
---|---|
Codable 이해 (0) | 2024.04.18 |
[Swift] - 옵셔널 (0) | 2024.03.26 |
[Swift] - git 충돌 해결 (0) | 2024.03.23 |
[Swift] - Could not build Objective-C module 'Accessibility' 오류 (1) | 2024.02.26 |