[iOS] App 기본 구조를 알아보자 - 2

Fezravien·2021년 9월 29일
0

App-Basic-Struct

목록 보기
2/2
post-thumbnail

앱의 상태 변화

앱은 실행되는 동안 다양한 상태로 변화한다.

  • 화면에 나타났다.
  • 화면으로부터 숨겨졌다.
  • 시작했다.
  • 종료했다.
  • etc ...

위와 같은 앱의 상태 변화는 운영체제가 처리하는 영역이며,
iPhone 운영체제인 iOS는 시스템에서 발생하는 특정 상황에 맞게 앱의 상태를 변화시키고 제어한다.

공식문서 - Managing Your App's Life Cycle
한번 살펴보도록 할게요 😀

Managing Your App's Life Cycle

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

앱의 현재 상태에 따라 언제든지 수행할 수 잇는 작업과 수행할 수 없는 작업이 결정되며,
앱이 상태별로 변경되면 그에 따라 동작을 조정해야한다.

  • foreground

    사용자의 주의를 끌기 때문에(사용자에게 보여지고 있는 상태) CPU를 포함한 시스템 리소스보다 우선순위가 높다.

  • background

    화면 밖이기(사용자에게 보여지지 않는 상태) 때문에 가능한 한 적은 작업만 해야 하고 가급적이면 아무것도 하지 않아야 한다.


앱의 상태가 변하면 `UIKit`은 적절한 대리자 객체의 메소드를 호출하여 알려준다.
  • iOS 13 이상에서는 UISceneDelegate 객체를 사용하여 scene-based app에 Life Cycle 이벤트에 응답한다.
  • iOS 12 이하에서는 UIApplicaionDelegate 객체를 사용하여 Life Cycle 이벤트에 응답한다.

앱에서 씬(scence) 지원을 활성화하면 iOS는 항상 iOS 13이상에서 scene delegate를 사용한다.
iOS 12이전의 버전에서는 시스템이 App delegate를 사용한다

iOS 버전이 올라감에 따라 등장한 UISceneDelegate는 다른 포스트에서 다루도록할게요 😙


Respond to Scene-Based Life-Cycle Events

앱에서 scene을 지원하는 경우 UIKit은 각각의 scene에 별도의 Life Cycle 이벤트를 제공하며,
scene은 디바이스에서 실행되는 앱 UI의 하나의 인스턴스를 나타낸다.

사용자가 각 앱에 대해 여러 장면을 만들고 이를 개별적으로 표시하거나 숨길 수 있으며,
각 scene마다 고유한 Life Cycle이 있기 때문에 각 scene마다 실행 상태가 다를 수 있다.
예를들어, 한 scene이 foreground에 있고 다른 scene은 background 또는 suspended 상태일 수도 있다.

🌟 Imporant
scene 지원은 선택기능이며 앱에서 지원을 사용하려면
app의 Info.plist 파일에 UIApplicationSceneManifest 키를 사용하면 된다.
Specifying the Scenes Your App Support 을 참고하세요.


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

사용자 또는 시스템이 앱에 대한 새로운 scene을 요청하면 UIKit에서 해당 scene을 만들어 unattached 상태로 만들며,
사용자가 요청한 scene이 foreground로 빠르게 이동하여 화면에 나타난다.

시스템이 요청한 scene은 일반적으로 background로 이동하여 이벤트를 처리할 수 있는데
예를 들어, 시스템이 background에서 scene을 실행하여 위치 이벤트를 처리할 수 있다.

사용자가 앱의 UI를 닫으면 UIKit은 연결된 scene을 background 상태로 이동하고 결국 suspended 상태로 이동하게 된다.
UIKit은 언제든지 background 또는 suspended 상태의 scene과 연결을 끊어서 리소스를 회수하여 해당 scene을 unattached 상태로 되돌릴 수 있다.


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을 참고하세요.


읽어 볼 것들이 넘쳐나네요 하하하..😅

Respond to App-Based Life-Cycle Events

iOS 12이전 버전과 scene을 지원하지 않는 앱에서 UIKit은 모든 라이프사이클 이벤트를 UIApplicationDelegate 객체에 제공한다.
App Delegate는 별도의 scene에 표시되는 Window를 포함하여 앱의 모든 Window를 관리한다.
결과적으로 앱 상태 전환은 외부 디스플레이의 콘텐츠를 포함하여 앱 전체 UI에 영향을 미친다.

아래 그림은 App Delegate 객체와 관련된 상태 전환을 보여준다.
실행 후 시스템은 UI가 화면에 표시될 것인지 여부에 따라 앱을 inactive 또는 background 상태로 전환하며,
foreground로 시작할 때 시스템은 앱을 자동으로 active 상태로 전환한다.
그 후 앱이 종료될 때까지 activebackground 상태로 왔다갔다 한다.


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


Respond to Other Significant Events

Life Cycle 이벤트 처리 외에도 앱은 아래와 같은 이벤트를 처리할 준비가 되어있어야 하며,
UIApplicationDelegate 객체를 사용하여 이벤트 대부분을 처리한다.
경우에 따라 알림을 사용하여 처리할 수도 있으므로 앱의 다른 부분에서 응답할 수도 있다.

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:)를 참고하세요.


가벼운 마음으로 정리를 시작했는데 읽을 거리가 엄청나게 많아졌네요 😢
차근차근 정리를 해보도록 하죠 ㅎㅎ

profile
꺼진 뷰도 다시보자.

0개의 댓글