앱 라이프 사이클 관리하기
앱이 foreground, background 상태에 있을 때 시스템 노티피케이션에 대응하고 시스템과 관련된 중요한 이벤트를 처리하세요.
Last updated
앱이 foreground, background 상태에 있을 때 시스템 노티피케이션에 대응하고 시스템과 관련된 중요한 이벤트를 처리하세요.
Last updated
원문 출처 https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle
앱은 현재 상태에 따라서 할 수 있는 작업과 할 수 없는 작업이 결정됩니다. 예를 들어, forground 앱은 사용자의 관심을 끌고 있고 있기 때문에 CPU를 포함한 시스템 자원에 있어서 우선권을 갖습니다. 반면에 background 앱은 화면에 나타나지 않기 때문에 가능한 한 적게, 되도록이면 아예 동작하지 않아야 합니다. 개발자는 앱의 상태가 변화할 때마다 앱의 동작을 적절하게 조절해주어야 합니다.
UIKit은 delegate 객체의 메서드를 적절히 호출함으로써 앱의 상태가 변화했음을 알려줍니다:
iOS 13부터 scene-based 앱에서는 UISceneDelegate 객체를 통해서 라이프 사이클 이벤트에 대응합니다.
iOS 12와 그 이전 버전에서는 UIApplicationDelegate 객체를 통해서 라이프 사이클 이벤트에 대응합니다.
Note
앱이 scene을 지원한다면 13버전 이상의 iOS는 무조건 scene delegate를 사용할 것입니다. iOS 12 이하의 시스템은 app delegate를 사용합니다
Scene을 지원하는 앱에서 UIKit은 라이프 사이클 이벤트가 발생할 때마다 각각의 이벤트를 전달합니다. Scene은 기기에서 실행되는 앱 UI의 인스턴스 하나를 의미합니다. 사용자는 각 앱에서 여러개의 scene을 생성할 수 있으며, 각각의 scene을 독립적으로 숨기거나 보이게 할 수 있습니다. 각 scene은 고유의 라이프 사이클을 가지고 있기 때문에 서로 다른 실행 상태에 있을 수 있습니다. 예를 들어 하나의 scene은 foreground에 올라와 있을 때, 나머지 scene들은 background 또는 중지상태일 수가 있습니다.
Important
Scene은 Opt-in 기능입니다. (기본 옵션이 아니라 설정 해주어야 사용가능하다는 뜻 - 역자 주) 기본 설정을 활성화하기 위해서는 Info.plist 파일에서 UIApplicationSceneManifest 키를 Specifying the Scenes Your App Supports 설명에 따라서 설정해야 합니다.
다음 그림은 scene들의 상태 전환을 보여줍니다. 사용자나 시스템이 앱에 새로운 scene을 요청하면 UIKit은 scene을 생성하고 unattached 상태로 둡니다. 사용자가 요청한 scene은 빠르게 foreground로 전환되어 화면에 나타납니다. 시스템이 요청한 scene은 보통 background로 이동하여 이벤트를 처리합니다. 예를 들면 시스템은 위치 이벤트를 처리할 scene을 background에서 실행하기도 합니다. 사용자가 앱의 UI를 닫으면 UIKit은 관련된 scene을 background 상태로 이동시키고, 최종적으로는 중단 상태로 만듭니다. UIKit은 리소스 반환을 요구받으면 언제든지 backgroun 또는 중단된 scene의 연결을 끊고 unattached 상태로 되돌려놓을 수 있습니다.
Scene 전환을 사용하여 다음 작업들을 수행하세요:
UIKit이 scene을 앱에 연결할 때 scene의 최초 UI를 구성하고 scene에 필요한 데이터를 불러오세요.
Forground-active 상태로 전환될 때 UI를 구성하고 사용자와 상호작용할 준비를 하세요. (Preparing Your UI to Run in the Foreground.)
Foreground-active 상태에서 벗어날 때 데이터를 저장하고 앱 동작을 중단시키세요. (Preparing Your UI to Run in the Background)
Background 상태에 진입 시 중요한 작업을 끝마치고, 되도록 많은 메모리를 해제하고, 앱 스냅샷을 준비하세요 (Preparing Your UI to Run in the Background)
Scene의 연결이 끊기면 scene과 관련된 공유 리소스를 정리하세요.
scene과 관련된 이벤트 외에, 앱이 실행될 때에도 UIApplicationDelegate를 통해 응답을 해야 합니다. 앱 실행시 필요한 작업에 대한 정보는 Responding to the Launch of Your App을 참조하세요.
iOS 12 이하에서는 scene을 지원하지 않으며, UIKit은 모든 라이프 사이클 이벤트를 UIApplicationDelegate 객체를 통해 전달합니다. App delegate는 분리된 스크린에 표시되는 것까지 포함하여 앱의 모든 window를 관리합니다. 결과적으로, 앱 상태 전환은 외부 디스플레이에 표시되는 컨텐츠를 포함하여 앱의 전체 UI에 영향을 줍니다.
다음 그림은 app delegate 객체와 관련된 상태 전환을 보여주고 있습니다. 실행 이후, 시스템은 앱이 스크린에 나타나는지 여부에 따라서 앱을 비활성 또는 background 상태로 만듭니다. foreground로 실행할 시, 시스템은 자동으로 앱을 활성화 상태로 전환시킵니다. 그 이후 종료될 때까지 앱은 active와 background 상태 사이를 오갑니다.
앱 전환을 사용하여 다음 작업을 수행하세요:
실행 시 앱의 데이터 구조화 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)
Background 상태로 전환 시 중요합 작업을 마치고, 최대한 많은 메모리를 해제하고, 앱 스냅샷을 준비하세요. (Preparing Your UI to Run in the Background)
종료 시 모든 작업을 즉시 중단하고 공유 리소스를 해제하세요. (applicationWillTerminate(_:))
앱은 라이프 사이클 이벤트 뿐만 아니라 다음 테이블에 나열된 이벤트들도 처리할 준비가 되어야 합니다. UIApplicationDelegate 객체를 사용하여 이들 이벤트의 대다수를 처리하세요. 경우에 따라 노티피케이션을 사용하여 처리할 수도 있으며 앱의 다른 부분에서 응답하는 것이 가능합니다.
메모리 경고에 응답하기 시스템에서 요청하면 메모리를 확보합니다.
앱 실행에 대응하기 앱 데이터 구조를 초기화하고 실행시킬 준비를 하세요. 그리고 실행 중에 발생하는 시스템 요청에 대응하세요.
class UIApplication iOS에서 실행되는 앱의 제어와 조정의 중심점
protocol UIApplicationDelegate 앱 라이프 타임동안 발생하는 중요한 이벤트에 대해 응답하기 위해서 UIApplication 싱글턴 객체가 호출하는 메서드 집합
Scenes 여러 개의 앱 UI 인스턴스를 동시에 관리하고 리소스를 적절한 인스턴스에 분배하세요.
Memory Warning
앱의 메모리 사용률이 너무 높을 경우 받는 메세지입니다. 메모리 경고에 응답하기 문서를 참조하세요.
Protected data becomes available/unavailable
유저가 기기를 잠그거나, 잠금 해제할 때 받는 메세지입니다.
applicationProtectedDataDidBecomeAvailable(_:) 와 applicationProtectedDataWillBecomeUnavailable(_:) 를 참조하세요.
Handoff tasks
NSUserActivity 객체의 처리가 필요할 때 받는 메세지입니다.
application(_:didupdate:)를 참조하세요.
Time changes
이동통신사로부터 수신되는 시간 업데이트 등의 이유로 시간의 변화가 발생할 때 받는 메세지입니다.
Open URLs
앱이 리소스를 열어야 할 때 수신되는 메세지입니다.
application(_:open:options:)를 참조하세요.