study record

[iOS] UIApplication (UIKit - UIApplication) 본문

iOS/iOS_Document

[iOS] UIApplication (UIKit - UIApplication)

asong 2022. 5. 12. 17:30

공식문서를 읽고 정리한 글입니다.

 

UIApplication

iOS에서 실행되는 앱들의 관리와 협력의 중심점

 

@MainActor class UIApplication : UIResponder

 


Overview

모든 iOS 앱은 정확하게 하나의 UIApplication의 인스턴스를 가진다(매우 드물게 UIApplication의 하위클래스). 앱이 시작할 때, 시스템은 UIApplicationMain(_:_:_:_:) 함수를 호출한다. 테스크들 사이에서, 이 함수는 shared를 사용해 접근하는 싱글톤 UIApplication 객체를 만든다. 

 

앱의 어플리케이션 객체는 유저 이벤트들의 초기 라우팅을 다룬다. 그것은 컨트롤 객체(UIControll 클래스의 인스턴스)에 의해 다가오는 액션 메세지들을 쫓는다. application 객체는 open windows의 리스트를 유지하고, 이것은 앱의 UIView 객체들을 회복하기 위해 사용할 수 있다.

 

UIApplication 클래스는 UIApplication Delegate 프로토콜을 채택하는 delegate를 정의한다. 그리고 프로토콜의 메서드들 몇몇을 시행해야 한다. application 객체는 상당한 런타임 이벤트들을 적절하게 반응할 기회를 주며 delegate에게 알린다. 예를 들어, 앱 시작, 낮은 메모리 경고, 앱 종료 등이 있다.

 

앱들은 협력적으로 이메일이나 이미지 파일 같은 자원들을 open(_:options:completionHandler:)메서드를 통해 다룰 수 있다. 예를 들어,이메일 URL과 함께 이 메서드를 호출하는 앱은 메일 앱이 시작하고 메세지를 보여주게 한다.

 

이 클래스의 API들은 디바이스 특정 행동을 관리하도록 해준다.

UIApplication 객체는 다음의 일을 한다.

- 임시적으로 다가오는 터치 이벤트들을 중지한다. (beginIgnoringInteractionEvents())

- 리모트 노티피케이션들을 등록 (registerForRemoteNotifications())

- undo-redo UI를 시작 (applicationSupportsShakeToEdit)

- 앱이 URL 스킴을 다루기 위해 등록된 설치된 앱이 있는지를 결정 (canOpenURL(_:))

- 백그라운드에서 테스크를 끝낼 수 있게 하기 위해 앱의 실행을 확장한다. (beginBackgroundTask(expirationHandler:), beginBackgroundTask(withName:expirationHandler:))

- 로컬 노티피케이션들을 스케줄하고 취소한다. (scheduleLocalNotification(_:), cancelLocalNotification(_:))

- 리모트 컨트롤 이벤트들의 환영을 협력(beginReceivingRemoteControlEvents(), endReceivingRemoteControlEvents())

- 앱 레벨 상태 저장 테스크들을 수행한다. (Managing the State Restoration Behavior 테스크 그룹의 메서드들)

 

Subclassing Notes

대부분의 앱들은 UIApplication의 하위클래스가 필요하지 않다. 대신에, 시스템과 앱 사이에서 상호작용들을 관리하기 위해 app delegate를 사용한다.

 

만약 앱이 시스템이 하기 전에 다가오는 이벤트를 다뤄야 한다면, 커스텀 이벤트를 시행하거나 디스패칭 메카니즘을 실행할 수 있다. 이것을 하기 위해서는 UIApplication을 상속하고, sendEvent(_:)나 sendAction_:to:from:for:)메서드를 오버라이드해야 한다. 가로막을 이벤트를 위해 이벤트를 다룬 후에, 호출에 의해 시스템이 쫓도록 한다.

 

super.sendEvent(event)

 

이벤트를 가로막는 것은 거의 요구되지 않으며, 가능한 피해야 한다.