티스토리 뷰
안녕하세요 Pingu입니다! 🐧
약간 그냥 정리하는 식으로 쓸 계획이라 조금 정신없을 수 있습니다....ㅎ
이번 글에서는 앱이 Foreground 일 때와 Background 일 때가 무슨 상태인지 알아보려고 합니다.
일단 그 전에 Foreground, Background를 포함하여 앱 실행상태에는 어떤것들이 있고 어떤 과정으로 변화하는지를 먼저 살펴보도록 하겠습니다.
앱이 Foreground인지 Background인지에 따라 할 수 있는 작업과 할 수 없는 작업이 나뉘게 되는데요, 앱이 Foreground 상태라면 사용자가 사용중이므로 UI와 같은 것들을 처리하는데 주력한다고 합니다.
앱이 Background 일때는 화면 밖에 있으니까 별 일을 하지 않겠죠?
앱이 Foreground, Background로 상태가 변할때마다 UIKit은 적절한 delegate 객체 메서드를 호출하여 알려주는데요, iOS13 부터는 UISceneDelegate가 이러한 것들을 처리한다고 하네요! 그 전에는 UIApplicationDelegate에서 처리했다고 합니다.
앱이 Scene을 지원한다면 UIKit은 각각의 Scene에 대해 별도의 Life Cycle 이벤트를 제공합니다. 여기서 Scene은 기기에서 실행되는 앱 UI의 하나의 인스턴스입니다. Scene에 대한 자세한 설명은 여기를 참고해주세요!
즉 Scene을 사용하면 하나의 앱에 대하여 여러개의 scene이 생길 수 있고 이러한 scene은 각자의 Life Cycle을 가진다는 말이됩니다!
위의 그림은 애플 문서에서 제공하는 Scene의 상태 전환을 보여주는 그림입니다.
사용자나 시스템이 앱의 Scene을 요청하면 UIKit이 이를 생성하고 Unattached상태로 둡니다.
요청자가 사용자라면 Scene을 바로 Foreground로 전환합니다.
요청자가 시스템이라면 Scene을 Background로 전환하여 이벤트를 처리할 수 있도록 합니다.
사용자가 앱의 UI를 닫으면 UIKit은 Scene을 Background로 전환하고 곧 Suspended 상태로 전환합니다.
UIKit은 Background, Suspended 상태의 앱은 언제든지 연결을 끊고 Unattached 상태로 전환할 수 있습니다.
이렇게 Scene을 사용하여 상태를 전환하는 과정을 살펴볼까요?
1. UIKit이 Scene을 앱에 연결하면 Scene의 초기 UI를 구성하고 Scene에 필요한 데이터를 load합니다.
2. Foreground 상태로 전환할 때 UI를 구성하고 사용자 상호작용을 준비합니다.
3. Foreground -> Background로 전환할 때 데이터를 저장하고 앱의 동작을 최소화합니다.
4. Background로 전환되면 중요한 작업을 완료하고 메모리를 많이 확보하여 App snapshot을 준비합니다. (여기서 스냅샷이란 그... 실행했던 앱들을 보여주는 그 화면에 사용할 스냅샷 입니다.)
5. Scene 연결이 끊어지면 연관되어있던 모든 리소스를 정리합니다.
iOS 12까지는 UIApplicationDelegate에서 모든 Life Cycle 이벤트를 처리한다고 했었죠?
이 때는 아래와 같이 상태 전환이 발생했다고 합니다. 즉 Scene을 사용하지 않을 때의 상태전환 과정인거죠!
아까랑 거의 비슷한데 상태의 이름이 다른 것을 볼 수 있어요. 앱이 시작하면 UI가 화면에 표시될것인지에 대한 정보에 따라 앱을 Inactive, background 상태로 전환합니다.
만약 화면에 표시가 될 것이라면 알아서 Active 상태로 전환하고 앱이 종료 될 때까지 active와 background 상태를 유지합니다.
이러한 방식을 App transition 이라고 하며 이 방법을 사용할 때의 과정은 아래와 같습니다.
1. 시작시 앱의 자료구조와 UI를 초기화 합니다.
2. Active 상태가 되면 UI 구성을 완료하고 사용자와 상호작용할 준비를 합니다.
3. Deactivation이 되면 데이터를 저장하고 앱 동작을 최소화합니다.
4. Background 상태가 되면 중요한 작업을 완료하고 메모리를 최대한 확보한 뒤 앱 스냅샷을 준비합니다.
5. 앱이 종료되면 작업을 즉시 중지하고 공유 자원을 해제합니다.
이를 정리하여 Foreground 앱이 Background로 전환되는 시점을 정리해보면 아래와 같아집니다.
1. 시스템 이벤트로 인해 일시 중지된 앱
2. 다른 앱이 시작될 경우
3. 사용자가 홈 화면으로 돌아오는 경우
이렇게 앱의 상태가 어떻게 변화하는지는 알았으니 각각의 상태에서 실행 가능한 것들에 대해 알아보겠습니다.
일단 Background 상태가 되면 추가적인 실행 시간을 할당받지 않는데요, UIKit은 아래의 경우에만 Background 앱에 실행 시간을 할당해 준다고 합니다.
1. AirPlay, Picture in Picture 비디오를 사용한 오디오 통신
2. 사용자 위치 서비스
3. Voice over IP
4. 외부 악세서리와의 통신
5. 블루투스 LE(Low Energy)와 통신, 혹은 디바이스를 블루투스 LE 악세서리로 변환
6. 서버에서의 정기적인 업데이트
7. Apple Push Notification 지원
얘네의 조합을 어디선가 본 기억이 있어 생각해봤더니 Xcode에 이러한 기능을 on/off하는 메뉴가 있던 기억이 나서 한 번 첨부해봅니다.
앱이 Foreground 일 때는 별다른 제약조건이 없는 듯한데요... 그래도 하나 찾은 건 저전력 모드에서 앱이 애니메이션 사용을 줄이고 프레임 속도를 낮추고 위치 업데이트를 중지하고 동기화 및 백업을 비활성화 하는 등의 작업을 할 수 있다고 합니다.
좀 더 알아본 뒤 알아낸 정보를 글에 추가하도록 해야겠네요..
감사합니다.
참고 문서
developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
'iOS > iOS_Memo' 카테고리의 다른 글
[iOS 앱개발] MPNowPlayingInfoPropertyElapsedPlaybackTime 오류 해결 방법 (0) | 2021.02.02 |
---|---|
[iOS 앱개발] CALayer 알아보기 1 (0) | 2021.01.28 |
[iOS 앱개발] 네비게이션 컨트롤러에서 뷰들을 한 번에 pop하기 (0) | 2021.01.05 |
[iOS 앱개발] MPRemoteCommandCenter 사용하기 (0) | 2021.01.04 |
[iOS 앱개발] 음악이나 동영상을 백그라운드에서 재생하기 (0) | 2021.01.04 |
- Total
- Today
- Yesterday
- OS
- 프로그래밍
- mac
- 앱개발
- 코딩테스트
- 문법
- Combine
- operating
- 알고리즘
- 스위프트
- Xcode
- design
- Swift
- 자료구조
- dfs
- 백준
- Apple
- 동시성
- DP
- pattern
- Publisher
- 코테
- IOS
- 테이블뷰
- System
- operator
- BFS
- OSTEP
- 아이폰
- document
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |