UIApplication에 대해 알아보자
- 목적 : 아주 희기하게 인터페이스나 현재 디바이스의 SafeArea영역의 값을 사용하기 위해서 사용되는 Class인 UIApplication이 어떤 클래스인지와 해당 클래스를 통해서 할 수 있는 것들에 대해서 알아보자.
UIApplication
iOS에서 돌아가는 앱들을 위한 준비와 통제의 중심점을 나타내는 객체이다.
모든 iOS 앱은 무조건 하나의 UIApplication인스턴스를 가진다. 앱이 열릴 때 시스템은 아래의 메서드를 호출한다.
UIApplicationMain(
_ argc: Int32,
_ argv: UnsafeMutablePointer<UnsafeMutablePointer<CChat>?>,
_ principalClassName: String?,
_ delegateClassName: String?
) -> Int32
다른 업무들 사이에서 이 함수는 shared 프로퍼티를 통해 당신이 접근할 수 있는 싱글톤 UIApplication 객체를 생성한다.
당신의 앱의 어플리케이션 객체는 들어오는 유저 이벤트의 초기의 라우팅을 처리한다. 어플리케이션 객체는 컨트롤 객체(UIControl 클래스의 인스턴스들)에 의해 액션 메세지들을 적절한 타겟 객체로 전달한다. 어플리케이션 객체는 앱의 UIView 객체들의 어떤것도 전달하는 데 사용되는 열려있는 윈도우들(UIWindow)의 목록을 관리한다.
어플리케이션 클래스는 UIApplicationDelegate 프로토콜을 준수하는 delegate를 정의하고 몇몇 프로토콜의 메서드들을 구현해야만한다. 어플리케이션 객체는 딜리게이트로 앱 런칭/메모리 부족 경고/앱 종료등의 수 많은 런타임 이벤트들을 딜리게이트로 알려주고, 적절하게응답할 수 있는 기회를 준다.
앱들은 이메일이나 이미지 파일등의 리소스를 아래 메서드를 통해 협력적으로 다를 수 있다.
func open(
_ url: URL,
options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:],
completionHandler completion: ((Bool) -> Void)? = nil
)
예를 들어 위 메서드를 통해 앱은 이메일 URL을 통해 메일 앱을 열고 메시지를 보여주거나 할 수 있다. 이 클래스의 API들은 너가 특정 디바이스의 행동을 관리하도록 허용한다. 아래의 내용들은 당신이 어플리케이션 객체를 통해 할 수 있는 것을 나타낸다.
- 임시적으로 들어오는 터치 이벤트들을 중단할 수 있다. (beginIgnoringInteractionEvents) - iOS13부터 Deprecated됨
- 애플로부터 내려오는 노티 서비스에 등록할 수 있다. (registerForRemoteNotifications)
- Undo/Redo UI를 호출할 수 있다. (applicationSupportsShakeToEdit)
- URL 스키마를 처리할 수 있는 등록되고 설치된 앱이 있는지 없는지 여부를 결정할 수 있다. (canOpenURL)
- 앱이 백그라운드 상태에서도 특정 테스크를 끝낼 수 있도록 앱의 실행을 확장할 수 있다. (beginBackgroundTask 혹은 beginBackgroundTask(withName:))
- 로컬 노티를 취소하거나 계획할 수 있다. - 애플로부터 오는 노티피케이션이 아닌, 클라이언트 로컬 노티피케이션 (UNUserNotificationCenter로 기능을 활용하는 객체가 변경됨)
- 원격-컨트롤 이벤트의 응답을 준비할 수 있다. (beginReceivingRemoteControlEvents 혹은 endReceivingRemoteControlEvents)
- 앱 수준의 상태 복구 업무를 실행할 수 있다.
대부분의 앱은 UIApplication의 서브클래싱이 필요없다. 대신에, 앱 딜리게이트를 사용해서 시스템과 앱간의 상호작용을 관리해라.
만약 당신의 앱이 시스템이 처리하기전에 들어오는 이벤트를 처리해야만 한다면 당신은 커스텀 이벤트를 구현하거나 액션 디스패칭 메커니즘을 구현할 수 있다. 이것을 하기 위해서 UIApplication을 서브클래싱하고 sendEvent와 sendAction 메서드를 오버라이딩해야한다. 당신이 가로채는 모든 이벤트에 대해서 당신이 이벤트를 처리한 후에는 super를 통해 부모 클래스에서 동일한 메서드를 호출하여 시스템에게 전달해야한다. 하지만, 직접 만들어서 시스템이 주는 이벤트를 가로채서 처리하는 케이스는 되도록 피해야하며 아주 희귀하게 요구되어진다.
정리하자면 UIApplication은 내가 만든 앱과 애플의 시스템(OS이거나 OS의 알고리즘, 비즈니스 로직등)에서 상호작용을 제어하는 객체라고 볼 수 있다. 시스템에서 전달되는 URL스킴의 처리가능 여부나 APN 서비스를 등록하고 해제한다던가등 여러모로 시스템으로부터 전달받는 이벤트에 대한 처리를 앱단에서 처리할 수 있도록 1차적으로 수행하는 객체라고 볼 수 있겠다. 시스템단에서 생성되는 인스턴스이니 앱이 살아있는 한 항상 존재한다고 봐도 될 것 같다.
이렇듯 UIApplication은 시스템과 앱사이의 여러가지 역할을 중재해주는 객체이다.
이 객체가 저런 포괄적인 기능을 가지고 있는 만큼, 각 기능에 대해서는 별도의 페이지에서 각각 분석하고 공부하는 것이 좋을듯하다.