UIApplication

delma·2020년 3월 10일
3

iOS

목록 보기
5/16
post-thumbnail

UIApplication을 이해하고자 문서를 번역, 정리한 내용입니다.(출처)

UIApplication

iOS 앱을 구동하기 위한 조정과 중앙 집중식 제어를 담당하는 곳


Declaration

@interface UIApplication : UIResponder

Overview

모든 iOS 앱에는 딱 하나의(exactly one instance) UIApplication 인스턴스가 존재한다.(혹은 아주 드물게 UIApplication의 서브클래스가 있다) 앱이 시작될 때, 시스템은 UIApplicationMain(_:_:_:_:) 메소드를 호출한다. 이 함수는 싱글톤 UIApplication 객체를 생성한다.
그 후에 sharedApplication 클래스 메소드를 호출해 그 객체(UIApplication 객체?)에 접근할 수 있다.

앱 애플리케이션 객체의 중요한 역할은 사용자 이벤트 초기 라우팅을 처리하는 것이다. 제어 오브젝트(UIControl 클래스의 인스턴스)가 적절한 타겟 오브젝트로 전달한 액션 메시지를 전달한다.
애플리케이션 객체는 열린 창 목록(UIWindow의 객체)을 유지하고 이를 통해 앱의 UIView 객체를 회수할 수 있다.

UIApplication 클래스는UIApplicationDelegate 프로토콜을 따르는 델리게이트를 정의하고 몇 프로토콜의 메소드를 구현한다. 이 어플리케이션 객체는 중요한 런타임 이벤트(예를들어 앱이 시작됐다거나, 메모리 부족 경고, 앱 종료)를 델리게이트에 알려 적절하게 대응할 수 있는 기회를 제공한다

이 클래스의 API를 따르면 디바이스의 구체적인 행동을 관리할 수 있다.

  • 터치 이벤트 일시 중지 (beginIgnoringInteractionEvents)
  • 원격 알림 등록 (registerForRemoteNotifications)
  • undo-redo UI 트리거 (applicationSupportsShakeToEdit)
  • URL scheme을 다루도록 설치된 앱이 등록되었는지 확인(canOpenURL:)
  • 백그라운드에서 작업을 완료할 수 있도록 앱 실행을 확장(beginBackgroundTaskWithExpirationHandler:, beginBackgroundTaskWithName:expirationHandler:)
  • 로컬 알림 스케줄링, 취소 (scheduleLocalNotification:, cancelLocalNotification:)
  • 원격 제어 이벤트 수신 조정(beginReceivingRemoteControlEvents, endReceivingRemoteControlEvents)
  • app-level 상태 복원 작업 (methods in the Managing the State Restoration Behavior task group)

Subclassing Notes

대부분의 앱은 UIApplication을 서브클래싱 할 필요가 없다. 대신 앱 델리게이트를 통해 시스템과 앱 사이의 상호작용을 관리하면 된다.

만약 아주 드문 경우에서 앱이 시스템보다 먼저 들어오는 이벤트를 다뤄야 한다면, 커스텀 이벤트를 구현하거나 작업 전달 메커니즘을 구현할 수 있다.
이렇게 하려면 UIApplicationsendEvent:, sendAction:to:from:forEvent: 메소드를 오버라이드 해야한다.
그리고 가로채는 모든 이벤트에 대해 처리한 후, 다시 시스템에 전달해야 한다.
이벤트를 가로채는 건 거의 필요하지 않고 가능한한 피해야 한다.


Summary

앱 시작시 시스템이 UIApplicationMain 메소드 호출
-> 호출되는 함수가 UIApplication 인스턴스를 만드는데, 얘는 앱에 딱 하나만 존재
-> 사용자의 터치 등이 시스템에 의해 이벤트로 생성되는데, 이 이벤트를 UIApplication이 받아서 UIControl 객체에 전달
-> UIControl 객체에 의해 이벤트 메시지(액션 메시지)가 적절한 대상에게 전달됨

그리고 UIApplicationUIApplicationDelegate 프로토콜을 채택해 중요한 런타임 이벤트(앱 시작,종료,메모리 부족 등)를 델리게이트가 처리하게 함.



delegate

UIApplication의 인스턴스 프로퍼티인 delegate에 대해 알아보자.
app object의 대리자이다.

Declaration

unowned(unsafe) var delegate: UIApplicationDelegate? { get set }

Discussion

모든 앱은 앱과 관련된 메시지에 응답하기 위해 app delegate 객체를 가져야 한다. 예를 들어, 앱은 앱 시작이 완료되고 foreground or background 상태가 변경될 때 델리게이트에게 알린다. 마찬가지로 시스템에서 오는 앱 관련 메시지는 종종 처리를 위해 app delegate에게 라우팅된다.
Xcode는 모든 앱에 초기 app delegate를 제공하므로 나중에 이 델리게이트를 변경할 필요가 없다.

델리게이트는 반드시 UIApplicationDelegate 프로토콜을 채택해야 한다.

profile
🌐Code makes world better

1개의 댓글

comment-user-thumbnail
2020년 3월 10일

UIApplication.delegate 객체가 AppDelegate의 인스턴스라고? 둘이 무슨 관계인지는 낼부터......

답글 달기