UIResponder, UIApplication, UIApplicationDelegate

Panther·2021년 3월 24일
0

Responding to the Launch of Your App
https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app
https://velog.io/@panther222128/Responding-to-the-Lauch-of-Your-App

Using Responders and the Responder Chain to Handle Events
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events
https://velog.io/@panther222128/Responder-Chain

UIResponder

https://developer.apple.com/documentation/uikit/uiresponder

"An abstract interface for responding to and handling events"

이벤트에 응답하고 이벤트를 다룰 수 있는 추상 인터페이스입니다.

Declaration

@MainActor class UIResponder : NSObject

Overview

리스폰더 객체, 즉 UIResponder의 인스턴스들은 UIKit 앱에서 이벤트를 다루는 근간을 이루고 있습니다. UIApplication, UIViewController, 모든 UIView 객체들 또한 리스폰더입니다. 이벤트가 발생하면 UIKit이 이벤트를 앱의 리스폰더 객체들에게 보냅니다.

터치 이벤트, 모션 이벤트, 리모트 컨트롤 이벤트, 프레스 이벤트를 포함한 여러 가지 이벤트가 존재합니다. 이벤트의 특정 타입을 처리하려면 리스폰더는 그에 상응하는 메소드를 오버라이드해야 합니다. 예를 들어 터치 이벤트를 처리하려면 리스폰더는 touchesBegan(:with:), touchesMoved(:with:), touchesEnded(:with:), touchesCancelled(:with:) 메소드를 구현해야 합니다. 터치의 경우 리스폰더는 터치에 대한 변경을 추적하고 앱의 인터페이스를 적합하게 업데이트 하기 위해 UIKit이 제공하는 이벤트 정보를 사용합니다.

이벤트를 다루는 것과 더불어 UIKit 리스폰더는 앱 내에서 처리되지 않은 이벤트를 보내는 것을 관리하기도 합니다. 어떤 리스폰더 이벤트를 처리하지 않는다면, 리스폰더 체인에 따라 다음 이벤트를 전달합니다. UIKit은 리스폰더 체인을 동적으로 다룹니다. 사전에 정의된 규칙에 따라 어떤 객체가 다음 이벤트를 받아야 하는지 결정하면서 진행됩니다.

리스폰더는 UIEvent 객체를 프로세싱하기도 하지만, 입력 뷰를 통해 커스텀 입력 역시 받아들일 수 있습니다. 입력 뷰의 대표적인 예가 키보드 입력과 관련한 뷰입니다. 예를 들어 사용자가 UITextField 혹은 UITextView 객체를 탭하면, 뷰는 첫 번째 리스폰더가 되고 립력 뷰를 활성화시키며 이 입력 뷰가 키보드입니다. 유사한 모양으로 커스텀 입력 뷰를 만들 수도 있습니다.

리스폰더와 리스폰더 체인에 관련해 더 많은 정보가 필요하다면 아래 링크를 살펴보면 좋습니다.

https://developer.apple.com/documentation/uikit/#//apple_ref/doc/uid/TP40009541

UIApplication

https://developer.apple.com/documentation/uikit/uiapplication

"The centralized point of contorl and coordination for apps running in iOS."

iOS에서 작동하는 앱에 대한 컨트롤과 조정의 중심점입니다.

Declaration

@MainActor class UIApplication : UIResponder

Overview

모든 iOS 앱은 정확히 하나의 UIApplication 인스턴스를 가집니다. (혹은 아주 드물게 UIApplication의 서브클래스를 갖습니다.) 앱이 launch될 때, 시스템은 UIApplicationMain(::::) 함수를 호출합니다. 이와 같은 작업 중 이 함수는 shared를 사용해 접근이 가능한 싱글턴 UIApplication 객체를 생성합니다.

앱의 application 객체는 사용자로부터 받는 이벤트의 시작 절차를 다루기 시작합니다. 이는 적절한 타깃 객체에게 액션 메시지를 보내는 것을 의미하며, 컨트롤 객체에 의해 수행됩니다. application 객체는 열려 있는 UIWindow를 유지합니다.

UIApplication 클래스는 UIApplication Delegate 프로토콜을 준수하는 딜리게이트를 정의하고 있으며, 몇 가지 프로토콜 메소드를 실행해야 합니다. application 객체는 중요한 런타임 이벤트에 상응하는 반응이 있을 수 있도록 딜리게이트를 알려줘야 합니다. 예를 들어 앱이 launch되었다거나 메모리 부족 경고, 앱 종료와 같은 것들입니다.

앱들은 메일, 이미지 같은 리소스를 다룰 수 있습니다. 예를 들어 특정 앱이 open(_:options:completionHandler:) 메소드를 통해 이메일 URL에 대응하는 메일앱을 launch하고 메시지를 보여줄 수 있습니다.

이 클래스 내에 API들은 기기의 특정 움직임을 관리할 수 있도록 합니다. 아래와 같은 내용들이 대표적입니다.

  • 일시적으로 터치 이벤트를 중단합니다.
  • 원격 노티피케이션 등록합니다.
  • undo-redo UI 시도합니다.
  • URL 스킴을 다루기 위해 등록된 앱이 설치될 것인지에 대한 결정을 합니다.
  • 앱이 백그라운드 상태에 들어섰을 때도 수행하고 있었던 동작을 마무리하기 위해 수행을 연장하는 것을 합니다.
  • 로컬 노티피케이션을 스케줄링하거나 취소합니다.
  • 원격 컨트롤 이벤트를 수신합니다.
  • 앱 레벨 상태에서 수행하던 것을 복구 실행합니다.

See Also


Life Cycle

Managing Your App's Life Cycle

앱이 포어그라운드 혹은 백그라운드에 진입할 때 시스템 노티피케이션에 응답합니다. 그리고 다른 중요한 시스템 관련 이벤트를 처리합니다.

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
https://velog.io/@panther222128/App-Life-Cycle

Responding to the Launch of Your App

앱의 데이터 구조를 초기화하고, 앱의 실행을 준비합니다. 그리고 시스템으로부터 모든 launch 타임 요청에 반응합니다.

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app
https://velog.io/@panther222128/Responding-to-the-Lauch-of-Your-App

Scenes

앱의 여러 UI 인스턴스들을 동시에 관리하고, 리소스들을 UI의 적합한 인스턴스로 보냅니다.

https://developer.apple.com/documentation/uikit/app_and_environment/scenes
https://velog.io/@panther222128/Scenes


UIApplicationDelegate

https://developer.apple.com/documentation/uikit/uiapplicationdelegate

"A set of methods to manage shared behaviors for your app."

앱에서 공유된 동작을 관리하기 위한 메소드의 집합입니다.

Declaration

@MainActor protocol UIApplicationDelegate

Overview

앱의 딜리게이트 객체는 앱의 공유된 동작을 관리합니다. 앱 딜리게이트는 앱의 루트 객체이며, UIApplication과 함께 시스템 상호작용을 관리합니다. UIApplication 객체처럼 UIKit 또한 앱 딜리게이트를 생성합니다. 이는 앱의 launch 주기 시작에서 수행됩니다.

앱 딜리게이트 객체는 다음을 수행합니다.

  • 앱의 중요 데이터 구조 초기화합니다.
  • 앱의 씬을 설정합니다.
  • 앱 밖에서 로우 메모리 경고, 다운로드 완료 노티피케이션처럼 특정 신호에 대한 반응을 합니다.
  • 앱 자체를 대상으로 하는 이벤트에 대한 응답, 그리고 앱의 씬, 뷰, 뷰 컨트롤러에 특정되지 않은 것에 대한 응답을 합니다.
  • launch 타임에 요구되는 모든 서비스를 등록하는 것을 합니다. 애플 푸시 노티피케이션 서비스와 같은 것이 대표적입니다.

Life-Cycle Management in iOS 12 and Earlier

iOS 12와 그 이전 버전에서 앱에 대한 주요 생명주기를 관리하기 위해 앱 딜리게이트를 사용했을 것입니다. 구체적으로 앱이 포어그라운드 혹은 백그라운드로 진입할 때 앱의 상태를 업데이트하기 위해 앱 딜리게이트의 메소드를 사용했을 것입니다.

  • 앱이 포어그라운드로 진입할 때 해야 하는 것에 대한 내용은 Preparing Your UI to Run in the Foreground를 살펴보시기 바랍니다.
  • 앱이 백그라운드로 진입할 때 해야 하는 것에 대한 내용은 Preparing Your UI to Run in the Background를 살펴보시기 바랍니다.
  • 앱의 생명주기에 대한 일반적인 정보는 Managing Your App's Life Cycle을 살펴보시기 바랍니다.

Preparing Your UI to Run in the Foreground
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground

Preparing Your UI to Run in the Background
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background

Managing Your App's Life Cycle
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
https://velog.io/@panther222128/App-Life-Cycle

0개의 댓글