본문 바로가기

공부/iOS

iOS - Managing Your App's Life Cycle (앱의 Life Cycle 관리)

안녕하세요. brody입니다.

 

이번 포스팅에서는 

애플 Documentation의 UIKit -> App and Environmet의 Managing Your App's Life Cycle 문서에 대해 공부해볼게요.

 

iOS 개발하면서 Life Cycle를 많이들 들어 보고, 사용도 했을텐데요.

 

제가 아는 내용

앱의 상태로는 Not Running, Foreground Inactive, Foreground active, background, suspended 이렇게 5가지 상태가 있다.

상태가 변할때 Appdelegate에서 몇몇 함수를 이용하여 앱의 상태가 바뀔때 작업을 할 수 있다.

 

이정도로 알고있는데 애플 문서에서는 어떻게 설명하는지 한번 볼게요~

 

시작하기 전에 이 문서에서 나오는 Scene은  iOS 13이상에서 Window를 대체하는 대체제라고 생각하면 편해요. iPad에서 iOS 13이후 Split View를 지원해주는데 이때는 각각의 화면이 Window를 가지고 있기 때문에 각각을  관리해주는 Scene Delegate가 나온거에요.

Scene의 문서는 아래의 링크와 같으며, 조만간 Scene문서를 번역하면서 좀더 세세하게 포스팅할게요!

https://developer.apple.com/documentation/uikit/app_and_environment/scenes

 

 

그럼 바로 시잘할게요 

 

애플 문서 링크는 아래와 같습니다 :)

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 


Managing Your App's Life Cycle(앱의 Life Cycle 관리)

앱이 foreground 또는 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리합니다.

 

Overview

앱의 현재 상태에 따라 언제든지 수행할 수 있는 작업과 수행 할 수 없는 작업이 결정됩니다.

 

예를들어 foreground 앱은 사용자의 주의를 끌기 때문에 CPU를 포함한 시스템 리소스보다 우선시 합니다.

 

반대로 background 앱은 화면 밖에(숨겨져) 있기 때문에 가능한 적은 작업을 수행해야 하며,  가급적이면 아무것도 수행하지 않아야 합니다. 

 

앱이 상태별로 변경되면 그에 따라 동작을 조정해야 합니다.

 

앱의 상태가 변하면 UIKit은 적절한 대리자 객체의 메서드를 호출하여 알려줍니다.

  • iOS 13 이상에서는 UISceneDelegate 객체를 사용하여 scene-based app에 Life Cycle 이벤트에 응답합니다.
  • iOS 12 이하에서는 UIApplicationDelegate 개체를 사용하여 Life Cycle 이벤트에 응답합니다.

NOTE

앱에서 씬(scence)을 지원을 활성화하면 iOS는 항상 iOS 13이상에서 scene delegate를 사용합니다.

iOS 12이전의 버전에서는 시스템이 App delegate를 사용합니다.

 

Respond to Scene-Based Life-Cycle Events(Scene-Based의 Life-Cycle 이벤트에 응답)

앱에서 scene을 지원하는 경우 UIKit은 각 scene에 대해 별도의 Life Cycle 이벤트를 제공합니다.

 

scene은 디바이스에서 실행되는 앱 UI의 한 인스턴스를 나타냅니다.

 

사용자가 각 앱에 대해 여러 장면을 만들고 이를 별도로 표시 및 숨길 수 있습니다.

 

각 scene마다 고유한 Life Cycle이 있기 때문에 각  scene마다 실행 상태가 다를 수 있습니다.

 

예를들어, 한 scene이 화면 전면에 있는 반면 다른 scene은 background에 있거나 suspended되어 있는 상태일 수 도 있습니다.

 

IMPORTANT

scene 지원은 선택기능입니다.

기본 지원을 사용하려면 앱에서 지원을 사용하려면 app의 Info.plist 파일에 UIApplicationSceneManifest 키를 사용하면 됩니다.

Specifying the Scenes Your App Support 을 참고하세요.

 

아래의 그림은 scene의 상태 전환을 보여줍니다.

 

사용자 또는 시스템이 앱에 대한 새 scene을 요청하면 UIKit이  생성하여 연결되지 않은 상태로 둡니다.

 

사용자가 요청한 scene은 화면 foreground로 빠르게 이동하여 화면에 나타납니다.

 

시스템이 요청한 scene은 일반적으로 이벤트를 처리할 수 있도록 background로 이동합니다.

 

예를들어, 시스템은 위치 이벤트를 처리하기 위하여 background에서 scene을 시작할 수 있습니다.

 

사용자가 앱의 UI를 닫으면 UIKit은 연결된 scene을 background 상태로, 그리고 결국 suspended 상태로 변경합니다.

 

UIKit은 언제든지 background 또는 suspended 상태의 scene을 연결 해제하여 리소스를 회수하여 해당 scene을 연결되지 않은 상태로 되돌릴 수 있습니다.

 

음... 제가 아는 내용이랑 조금은 달라졌지만 유사하네요 하하... 

 

scene 전환을 사용하여 다름 작업을 수행할 수 있습니다.

  • UIKit이 scene을 앱에 연결하면, scene의 초기 UI를 구성하고 scene에 필요한 데이터를 로드합니다.

  • foreground로 상태가 전환될 때 UI를 구성하고 사용자와 상호 작용할 준비를 합니다. 
    Preparing Your UI to Run in the Foreground  문서를 참고하세요.

  • foreground-active 상태를 벗어나면 데이터를 저장하고 앱 동작을 조용하게(queit)하게 합니다.
    Preparing Your UI to Run in the Background 문서를 참고하세요.

  • background 상태에 들어가면 중요한 작업을 완료하고 가능한 많은 메모리를 확보하고 앱 스냅샷을 준비합니다. 
    Preparing Your UI to Run in the background 문서를 참고하세요.

  • scene 연결이 끊어질때, scene과 연결된 모든 공유 리소스를 정리합니다.

  • scene 관련 이벤트 외에도 UIApplecationDelegate 객체를 사용하여 앱 시작에 응답해야 합니다.
    앱 시작시 수행할 작업에 대해서는 Responding to the Launch of Your App을 참고하세요.
    (UI LifeCycle은 SceneDelegate에서 해주지만 앱 시작 관련된 내용은 아직 Appdelegate에서 해야하죠~)

 

Respond to App-Based Life-Cycle Events(앱 기반의 Life Cycle 이벤트 응답)

iOS 12이전 버전과 scene을 지원하지 않는 앱에서 UIKit은 모든 라이프사이클 이벤트를 UIApplication 객체에 제공합니다.

 

App Delegate 는 별도의 scene에 표시되는 Window을 포함하여 앱의 모든 window를 관리합니다.

 

결과적으로 앱 상태 전환은 외부 디스플레이의 콘텐츠를 포함하여 앱 전체 UI에 영향을 줍니다.

 

다음 그림은 App Delegate 개체와 관련된 상태 전환을 보여줍니다.

 

실행 후 시스템은 UI가 화면에 표시 될 것인지 여부에 따라 앱을 inactive 또는 background 상태로 전환합니다.

 

foreground로 시작할 때 시스템은 앱을 자동으로 active 상태로 전환합니다.

 

그 후 앱이 종료될떄까지 active와 background 사이에서 상태가 변합니다.

 

 

제가 알던 그 그림이 요기있네요 하하!

 

앱 전환을 사용하여 다음 작업을 수행할 수 있습니다.

 

Respond to Other Significant Events(기타 이벤트 응답)

Life Cycle 이벤트 처리 외에도 앱은 아래와 같이 나열된 이벤트를 처리할 준비가 되어 있어야 합니다.

 

UIApplcateionDelegate 객체를 사용하여 이러한 이벤트 대부분을 처리합니다.

 

경우에 따라 알림을 사용하여 처리할 수도 있으므로 앱의 다른 부분에서 응답할 수 있습니다.

 

Memory warnings

앱이 메모리 사용량이 너무 높을때 수신됩니다. 앱에서 사용하는 메모리 양을 줄입니다.

Resonding to Memory Warning 문서를 참고하세요

 

Protected data becomes avaiable/unavaiable

사용자가 기기를 잠그거나 잠금 해제할때 수신됩니다.

applicationProtectedDataDidBecomeAvaiable(_:) 과 
applicationProtectedDataWillBecomeUnavailable(_:) 를 참고하세요.

 

Handoff task

NSUserActivity 객체를 처리해야 할 때 수신됩니다. 
application(_:didUpdate:)를 참고하세요.

 

Time changes

전화 통신사가 시간 업데이트를 보내는 경우와 같이 여러가지 다른 시간 변경에 대해 수신됩니다.

applicationSignificanTimeChange(_:)를 참고하세요.

 

Open URLs

앱에서 리소스를 열어야 할 때 수신됩니다. 

applicagtion(_:open:options:)를 참고하세요. 

 

 


후........

여기까지 입니다...

 

가벼운 마음으로 시작했다가 공부할게 많아져서 무거운 마음으로 끝났네요 ㅋㅋ 

그래도 뭘 할지 몰라서 막막했을때보다는 양반입니다!

Scene부터 볼까 하다가.. 어차피 곧 보게될거 순서대로 볼게요!

 

그럼 다음 포스팅은 Responding to the Launch of Your App이 되겠네요

 

그럼 오늘은 여기까지 할게욥~

 

ㅅㄱㄹ!