라이프 사이클
라이프 사이클
앱의 상태는 할 수 있는 것과 할 수 없는 것을 결정한다.
유저의 주의를 끄는 포그라운드 앱은 CPU와 같은 시스템 자원에 대한 우선권을 가진다.
반대로 백그라운드 앱은 화면에서 보이지 않기 때문에 가능한 한 적은 일을 해야 한다.
따라서 앱의 상태가 변하면 그에 따라 앱의 작동도 조정할 필요가 있다.
앱의 상태가 변할 때, UIKit은 델리게이트 객체의 호출 메소드를 통해 이를 전달한다.
iOS 13 이후에는 씬 기반 앱의 라이프 사이클에 반응하기 위해 UISceneDelegate
객체를 사용한다.
iOS 12 이전에는 라이프 사이클 이벤트에 반응하기 위해 UIApplicationDelegate
객체를 사용한다.
씬 기반 라이프 사이클 이벤트에 반응
앱이 여러 씬을 지원한다면, UIKit은 각각에 독립적인 라이프 사이클 이벤트를 전달한다.
씬은 디바이스에서 작동하는 앱 UI의 인스턴스를 보여준다.
사용자는 하나의 앱에 여러 씬을 만들 수 있고, 각각을 보이게 하거나 숨길 수 있다.
각 씬들은 자신만의 라이프 사이클을 가지기 때문에, 씬 마다 다른 상태일 수 있다.
예로들면 한 씬은 포그라운드지만, 다른 씬들은 백그라운드 혹은 중지(suspended) 상태일 수도 있다.
씬 지원은 선택 사항이다. 기본 지원을 사용하려면, Info.plist 파일에 UIApplicationSceneManifest 키를 추가하면 된다.
아래 그림은 씬의 상태 간 전이를 보여준다. 사용자 또는 시스템이 앱의 새로운 씬을 요청하면, UIKit은 씬을 생성하고 unattached 상태로 둔다. 사용자에 의해 요청된 씬은 빠르게 포그라운드 상태로 진입한다. 시스템에 의해 요청된 씬은 보통 이벤트를 처리할 수 있도록 백드라운드 상태에 진입한다. (예로 위치 이벤트를 처리하기 위해 백그라운드 상태로 씬을 런치한다.) 사용자가 앱 UI를 닫으면 UIKit은 관련 씬을 백그라운드 상태로 전환하고, 결과적으로 중지상태가 된다. UIKit은 자원을 회수하기 위해 언제든지 백그라운드나 중지 상태의 씬과 연결을 끊고 unattached 상태로 전환할 수 있다.
씬 전환이 사용되는 예
UIKit이 씬을 앱에 연결하면, 씬의 초기 UI를 구성하고 씬이 필요한 데이터를 로드한다.
포그라운드-액티브 상태로 진입할 때, UI를 구성하고 사용자와의 상호작용할 준비를 한다.
포그라운드-액티브 상태를 종료할 때, 데이터를 저장하고 앱의 동작을 조용하게 한다.
백그라운드 상태로 진입할 때, 중요한 작업을 마무리하고, 가능한 한 많은 메모리를 확보하고, 앱의 스냅샷을 준비한다.
씬 연결이 끊어지면, 씬과 관련된 공유 리소스들을 비운다.
씬 관련 이벤트 외에도, UIApplicationDelegate 객체를 사용하는 앱의 실행에 반응해야 한다.
앱 기반 라이프 사이클 이벤트에 반응
ios 12 이전 앱들은 다수의 씬을 지원하지 않았다. UIKit은 모든 라이프 사이클 이벤트를 UIApplicationDelegate 객체에 전달한다. 앱 델리게이트는 별도 스크린의 컨텐츠를 포함해서 앱의 모든 윈도우를 관리한다. 결과적으로 앱 상태 전이는 외부 디스플레이의 콘텐츠를 포함해서 앱의 전체 UI에 영향을 준다.
아래 그림은 앱 델리게이트 객체와 관련된 상태 전이들을 보여준다. 앱을 실행하면 시스템은 UI가 스크린에 보여질 지 여부에 따라 앱을 비활성 또는 백그라운드 상태로 둔다. 포그라운드로 진입하면 시스템은 앱을 자동적으로 활성 상태로 전이한다. 그 이후로는 앱이 종료될 때까지 활성과 백그라운드 상태에서 변동한다.
앱 전이가 사용되는 예
런치 시, 앱의 자료구조와 UI를 초기화한다.
활성 시, UI구성을 완료하고 사용자와 상호작용할 준비를 한다.
비활성 시, 데이터를 저장하고 앱의 동작을 조용하게 한다.
백그라운드 상태 진입시, 중요한 작업을 마무리하고 가능한 한 많은 메모리를 확보한다. 그리고 앱 스냅샷을 준비한다.
종료 시, 모든 작업을 즉시 종료하고, 공유 자원을 해제한다.
라이프 사이클 관리 이외에도 앱은 다음 이벤트 처리를 준비해야 한다.
이러한 이벤트들을 처리하기 위해 대부분 UIApplicationDelegate 객체를 사용할 수 있다.
경우에 따라 앱의 다른 부분에 반응하며 알림을 사용하여 이벤트를 처리할 수 있다.
메모리 경고 | 앱의 메모리 사용이 너무 많은 경우 수신 |
---|---|
보호된 데이터 이용 가능/불가능 | 사용자가 디바이스를 잠금/해제 할 경우 수신 |
핸드오프 작업(작업을 다른 기기에서 이어서 함 ) | NSUserActivity 객체를 처리해야 할 경우 수신 |
시간 변경 | 이동 통신사가 시간 업데이트를 보내는 경우와 같이, 여러가지 다른 시간 변경에 대해 수신 |
url 열기 | 앱이 리소스를 열어야 할 때 수신 |
Leave a comment