앱은 포그라운드 또는 백그라운드에 있을 때 시스템 notification에 응답하고 기타 중요한 시스템 관련 이벤트를 처리한다.
Overview
앱의 현재 상태에 따라 언제든지 할 수 있는 작업과 할 수 없는 작업이 결정된다. 예를 들어 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 포함한 시스템 리소스보다 우선한다. 반대로 백그라운드 앱은 화면 밖이기 때문에 가능한 한 작업을 거의 수행하지 않아야 한다. 앱이 상태별로 변경되면 그에 따라 동작을 조정해야 한다.
앱의 상태가 변경되면 UIKit은 적절한 델리게이트 오브젝트의 메서드를 호출하여 알려준다.
- iOS 13 이상에서는 UISceneDelegate 오브젝트를 사용하여 scene-based 앱의 라이프 사이클 이벤트에 응답한다.
- iOS 12 및 이전 버전에서는 UIApplicationDelegate 오브젝트를 사용하여 라이프 사이클 이벤트에 응답한다.
추가
앱에서 scene 지원을 활성화하면 iOS는 항상 iOS 13 이상에서 scene delegate를 사용해야 한다. iOS 12 및 이전 버전에서는 시스템이 app delegate를 사용한다.
Respond to Scene-Based Life-Cycle Events
앱이 Scene을 지원하는 경우 UIKit은 각각에 대해 별도의 라이프 사이클 이벤트를 제공한다. scene은 기기에서 실행되는 앱 UI의 한 인스턴스를 나타낸다. 사용자는 각 앱에 대해 여러 scene을 만들고 개별적으로 표시하거나 숨길 수 있다. 각 scene에는 고유한 라이프 사이클이 있으므로 각 scene은 다른 실행 상태에 있을 수 있다. 예를 들어 한 scene은 포어그라운드에 있고 다른 scene은 백그라운드에 있거나 일시 중단 될 수 있다.
중요
scene 지원은 opt-in 기능이다. 기본 지원을 사용하려면 Specifying the Scenes Your App Supports. 에 설명된대로 UIApplicationSceneManifest 키를 앱의 Info.plist 파일에 추가한다.
하단의 그림은 scene의 상태 전환을 보여준다. 사용자 또는 시스템이 앱에 대한 새 scene을 요청하면 UIKit이 이를 생성하고 연결되지 않은 상태로 둔다. 사용자가 요청한 scene은 화면에 나타나는 포어그라운드로 빠르게 이동한다. 시스템이 요청한 scene은 일반적으로 이벤트를 처리 할 수 있도록 백그라운드로 이동한다. 예를 들어, 시스템은 위치 이벤트를 처리하기 위해 백그라운드에서 scene을 시작할 수 있다. 사용자가 앱의 UI를 닫으면 UIKit은 연결된 scene을 백그라운드 상태로 이동하고 결국에는 일시 중단 된 상태로 이동시킨다. UIKit은 언제든지 백그라운드 또는 일시 중단 된 scene을 연결 해제하고 리소스를 회수하여 해당 scene을 연결되지 않은 상태로 되돌릴 수 있다.
scene transition을 사용하여 다음 작업을 수행하시오.
- UIKit이 scene을 앱에 연결할 때 scene의 초기 UI를 구성하고 scene에 필요한 데이터를 로드한다.
- 포어그라운드 활성 상태로 전환 할 때 UI를 설정하고 사용자와 상호 작용할 준비를 한다. Preparing Your UI to Run in the Foreground 를 참조하시오.
- 포어그라운드 활성 상태에서 나갈 때 데이터를 저장하고 앱 동작을 정지한다. Preparing Your UI to Run in the Background 참조하시오.
- 백그라운드 상태에 들어가면 중요한 태스크를 완료하고 가능한 한 많은 메모리를 확보한 후 앱 스냅 샷을 준비한다. Preparing Your UI to Run in the Background 를 참조하시오.
- scene의 연결이 끊어지면 scene과 연결된 모든 공유 리소스를 정리한다.
- scene 관련 이벤트 외에도 UIApplicationDelegate 오브젝트를 사용하여 앱 시작에 응답해야 한다. 앱 시작시 수행 할 작업에 대한 정보는 Responding to the Launch of Your App을 참조하시오.
Respond to App-Based Life-Cycle Events
iOS 12 및 이전 버전과 Scene을 지원하지 않는 앱에서는 UIKit가 모든 라이프 사이클 이벤트를 UIApplicationDelegate 오브젝트에 전달한다. App Delegate는 별도의 화면에 표시되는 창을 포함하여 앱의 모든 창을 관리한다. 결과적으로 앱 상태 전환은 외부 디스플레이의 콘텐츠를 포함하여 앱의 전체 UI에 영향을 준다.
하단의 그림은 App delegate object와 관련된 상태 전환을 보여준다. 실행 후 시스템은 UI가 화면에 표시 될 것인지 여부에 따라 앱을 비활성화 또는 백그라운드 상태로 전환한다. 포어그라운드로 시작하면 시스템이 자동으로 앱을 활성 상태로 전환한다. 그 후 상태는 앱이 종료 될 때까지 활성과 백그라운드 사이에서 변동한다.
App transition을 사용하여 다음 작업을 수행한다.
- 실행할 때 앱의 데이터 구조 및 UI를 초기화한다. Responding to the Launch of Your App을 참조하시오.
- 활성화 시 UI 설정을 완료하고 사용자와 상호 작용할 준비를 한다. Preparing Your UI to Run in the Foreground를 참조하시오.
- 비활성화 시 데이터를 저장하고 앱 동작을 정지한다. Preparing Your UI to Run in the Background를 참조하시오.
- 백그라운드 상태로 전환되면 중요한 태스크를 완료하고 가능한 많은 메모리를 확보한 후 앱 스냅샷을 준비한다. Preparing Your UI to Run in the Background를 참조하시오.
- 종료 시 모든 작업을 즉시 중지하고 공유 리소스를 해제한다. applicationWillTerminate(_:)를 참조하시오.
Respond to Other Significant Events
라이프 사이클 이벤트를 처리하는 것 외에도 앱은 하단의 표에 나열된 이벤트를 처리 할 준비가 되어 있어야 한다. UIApplicationDelegate 오브젝트를 사용하여 이러한 이벤트 대부분을 처리할 수 있다. 경우에 따라 notification을 사용하여 처리 할 수도 있으므로 앱의 다른 부분에서 응답 할 수 있다.
Memory warnings | 앱의 메모리 사용량이 너무 높을 때 수신된다. 앱에서 사용하는 메모리 양을 줄이시오. Responding to Memory Warnings 을 참조하시오. |
Protected data becomes available/unavailable | 사용자가 기기를 잠그거나 잠금 해제 할 때 수신된다. applicationProtectedDataDidBecomeAvailable(_:) 및 applicationProtectedDataWillBecomeUnavailable(_:)을 참조하시오. |
Handoff tasks | NSUserActivity 오브젝트를 처리해야 할 때 수신된다. application(_:didUpdate:)을 참조하시오. |
Time changes | 전화 통신사가 시간 업데이트를 보내는 경우와 같이 여러 다른 시간 변경에 대해 수신된다. applicationSignificantTimeChange(_:)을 참조하시오. |
Open URLs | 앱에서 리소스를 열어야 할 때 수신된다. application(_:open:options:)을 참조하시오. |
[원본]
Apple Developer Documentation
developer.apple.com
'프로그래밍 > iOS' 카테고리의 다른 글
Preparing Your UI to Run in the Foreground (0) | 2020.12.31 |
---|---|
Specifying the Scenes Your App Supports (0) | 2020.12.31 |
Concurrency Programming Guide (6) - Migrating Away from Threads (0) | 2020.12.27 |
Concurrency Programming Guide (5) - Dispatch Sources (0) | 2020.12.26 |
Concurrency Programming Guide (4) - Dispatch Queues (0) | 2020.12.25 |