study record

[iOS] Managing App's Life Cycle (UIKit - App And Environment - Managing Your App's Life Cycle) 본문

iOS/iOS_Document

[iOS] Managing App's Life Cycle (UIKit - App And Environment - Managing Your App's Life Cycle)

asong 2022. 4. 30. 17:12

공식문서를 읽고 작성한 글입니다.

 

Managing Your App's Life Cycle

앱이 포그라운드나 백그라운드에 있을 때 시스템 알림에 응답하는 것, 그리고 또다른 중요한 시스템 관련 이벤트를 다루는 것.


Overview

앱의 현재 상태는 언제 어떤 것을 할 수 있는지, 없는지를 결정한다. 예를 들어, 포그라운드 앱은 사용자의 관심을 가지고, CPU를 포함하여 시스템 자원들에 우선순위를 가진다. 대조적으로, 백그라운드 앱은 화면 밖에 있기 때문에 가능한 적게 일을 해야하며, 아무것도 하지 않는 것이 선호된다. 앱이 상태에서 상태로 변화하기 때문에, 그에 맞게 행동을 취해야 한다.

 

앱 상태가 변화할 때, UIKit는 적절한 delegate 객체의 메서드들을 호출함에 의해 알려준다.

- iOS 13 이후에는 scene 베이스 앱에서 라이프 사이클에 반응하는 UISceneDelegate 객체를 사용한다.

- iOS 12 이전에는 라이프 사이클 이벤트에 반응하기 위해 UIApplicationDelegate 객체를 사용한다.

 

*Note

만약 앱에서 scene 서포트가 가능하다면, iOS는 항상 iOS 13이후의 scene delegate를 사용한다. iOS 12 이전에서 시스템은 app delegate를 사용한다.

 

Respond to Scene-Based Life-Cycle Events

만약 앱이 scene을 지원한다면, UIKit은 분리된 라이프 사이클 이벤트를 전달한다. 씬은 디바이스에서 앱의 UI 작동의 하나의 인스턴스를 나타낸다. 유저가 각각의 앱을 위해 다양한 씬들을 만들 수 있고, 각각 숨기거나 보여줄 수 있다. 각 씬은 각자의 라이프 사이클을 가지고 있기 때문에, 하나의 씬이 포그라운드에 있고 다른 씬들은 백그라운드나 중지될 수도 있다.

 

*Important

Scene 지원은 옵셔널이다. 기본 지원을 가능하게 하기 위해서는 앱 Info.plist 파일에 UIApplicationSceneManifest 키를 더하면 된다.

 

다음의 그림은 씬들의 상태 변화를 보여준다. 유저나 시스템이 앱을 위해 새로운 씬을 요청할 때, UIKit는 씬을 만들고 부착되지 않은 상태에 넣는다. 유저가 요청한 씬들은 포그라운드에 빠르게 이동하고 화면에 나타난다. 시스템 요청 씬은 전형적으로 백그라운드로 이동하여 이벤트를 수행할 수 있게 한다. 예를 들어, 시스템이 위치 이벤트를 진행하기 위해 백그라운드에 씬을 시작할지도 모른다. 유저가 앱의 UI를 사라지게 할 때, UIKit는 백그라운드 상태에 연관된 씬을 이동시키고, 결국 suspended 상태가 된다. UIKit는 백그라운드나 suspended 씬의 연결을 끊을 수 있다.

 

 

유저 씬 변환이 사용하는 상황들

- UIKit가 앱에 씬을 연결할 때, 씬의 초기 UI를 설정하고 씬이 필요한 데이터를 로드

- 포그라운드-active 상태로 변환할 때, UI를 설정하고 유저에 상호작용을 준비

- 포그라운드-active 상태를 떠나기 위해 데이터를 저장

- 백그라운드 상태에 들어가기 위해, 중요한 작업들을 끝내고 가능한한 많은 메모리를 해제시킨다.

- 씬 연결해제를 위해 씬과 연관된 공유 자원을 청소

- 씬 관련 이벤트에 더불어, UIApplicationDelegate 객체를 사용해 앱의 시작에 반응해야 한다.

 

Respond to App-Based Life-Cycle Events

iOS 12 이전에, 씬을 지원하지 않는 앱들에서 UIKit는 모든 라이프 사이클을 UIApplicationDelegate 객체에 전달한다. 앱 델리게이트는 분리된 화면에 보여지는 것들을 포함하는 앱의 윈도우를 관리한다. 결과적으로, 앱 사애 변환은 앱의 전반적 UI에 영향을 미친다.

 

다음의 그림은 앱 델리게이트 객체를 포함하는 상태 변환을 보여준다. 런치 후에, 시스템은 UI가 화면에 보이려는지 여부에 따라 inactive나 background 상태에 앱을 넣는다. 포그라운드에 런치할 때, 시스템 변환은 active 상태로 자동적으로 이동한다. 이후에, 상태는 액티브와 백그라운드 사이를 앱이 종료할 때까지 변화한다.

 

 

다음의 작업을 수행하기 위해 앱 변환을 사용한다.

- 런치할 때, 앱의 데이터 구조와 UI를 초기화

- 활성화할 때, UI설정을 마무리하고 유저와 상호작용을 준비

- 활성화해제를 향해, 데이터를 저장, 앱 행동 멈추기

- 백그라운드 상태에 들어가기 위해, 중요 작업을 끝내고, 많은 메모리를 해제.

- 종료 시, 즉시 모든 작업을 멈추고, 공유 자원을 방출.

 

Respond to Other Significant Events

라이프 사이클 이벤트들을 다루는 것에 더불어, 앱들은 다음의 테이블에 리스트된 이벤트들을 다루기 위한 준비를 해야 한다. 이 이벤트들을 다루기 위해 UIApplicationDelegate 객체를 사용한다. 많은 경우에,  앱의 다른 파트로부터 반응하도록 하는 Notification을 사용하는 이벤트를 다룰지도 모른다.

 

1. 메모리 경고

앱의 메모리 사용량이 매우 높을 때 받는다. 앱이 사용하는 메모리의 양을 줄이기

 

2. Protected 데이터를 사용가능/불가능하게 하기

사용자가 장치를 풀거나 풀지 않을 때 받는다.

applicationProtectedDataDidBecomeAvailable(_:), applicationProtectedDataWillBecomeUnavailable(_:)

 

3. Handoff 작업들

NSUserActivity 객체가 진행되기 위해 필요할 때 받아진다.

 

4. 시간 변화

다른 시간 변화 때문에 받아진다. 핸드폰이 시간 업데이트를 받을 때가 있다. applicationSignificantTimeChange(_:)

 

5. URLs 열기

앱이 자원을 여는 것이 필요할 때 받는다. application(_:open:options:)