[TIL] UIApplication 에 대해 공부했습니다

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • delma
      참가자
      • 글작성 : 2
      • 답글작성 : 4

      앱 라이프 사이클에 대해 공부하려다
      UIApplication이 중요한 애인 것 같은데 너무 궁금하고 잘 모르겠어서 공식 문서를 참고하며 공부해봤습니다!
      특히 아래 서머리가 제가 이해한대로 정리해본건데, 읽어보시고 틀린 부분 있다면 피드백 부탁드립니다!

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

      UIApplication

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

      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이 받아서 UIContrl 객체에 전달
      -> UIControl 객체에 의해 이벤트 메시지(액션 메시지)가 적절한 대상에게 전달됨
      그리고 UIApplicatinUIApplicationDelegate 프로토콜을 채택해 중요한 런타임 이벤트(앱 시작,종료,메모리 부족 등)를 델리게이트가 처리하게 함.

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      멋진 정리 고맙습니다!
      다른 분들께 큰 도움이 될 것 같아요.
      질문이 있어요!

      1. UIApplicationMain 메서드를 호출하는 코드는 어디에 있나요? 혹은 어디에서 볼 수 있나요?
      2. 가로챈 이벤트는 처리 후 다시 시스템에게 전달해야 한다고 했는데, 전달하는 방법은 어떻게 되나요?

      p.s. Typo correction : UIContrl -> UIControl, UIApplicatin -> UIApplication

      • delma
        참가자
        • 글작성 : 2
        • 답글작성 : 4

        읽어주셔서 감사합니다! 먼저 UIApplicationMain 메서드를 호출하는 코드는 어디에 있나요? 혹은 어디에서 볼 수 있나요? 라는 질문에 답변 하겠습니다

        오늘 AppDelegate.swift 파일에 대해 찾아봤는데 마침 거기서 질문에 대한 답을 찾을 수 있었어요 ㅎㅎ \n
        프로젝트를 생성하면 반드시 AppDelegate.swift 파일이 있는데 거기에는 AppDelegate 클래스가 정의되어있습니다.!
        상단에 보면 @UIApplicationMain 이라고 볼 수 있는데, 그렇게 속성을 사용하는 것이 UIApplicationMain 메소드를 호출하는 것과 같다고 합니다!
        그 이후에 위 글에서 정리한 것처럼 UIApplication 인스턴스가 생성되고 앱을 시작할 준비를 하는 것 같습니다.!

        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 580

          그렇군요! 두 번째 질문의 답변도 기대됩니다 😀

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom