UIApplication

Young Bin Lee·2023년 7월 10일
0

research

목록 보기
5/6

UIApplication


모든 iOS 앱에는 반드시 하나UIApplication 인스턴스가 있으며 매우 드물게 UIApplication의 서브클래스가 존재합니다.

UIKIT_EXTERN int UIApplicationMain(
    int argc, char * _Nullable argv[_Nonnull],
    NSString * _Nullable principalClassName,
    NSString * _Nullable delegateClassName
);
@interface UIApplication : UIResponder
@property(class, nonatomic, readonly) UIApplication *sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.");
@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate;
  • 앱이 실행되면 시스템은 UIApplicationMain 함수를 호출합니다. 이 함수는 shared 싱글톤 UIApplication 객체를 생성합니다.
    • principalClassNameUIApplication 클래스 또는 서브클래스의 이름입니다. nil을 지정하면 UIApplication으로 가정합니다.
    • delegateClassName: application delegate를 지정할 클래스 이름입니다. UIApplication의 서브클래스를 지정할 경우, 해당 클래스를 delegate로 지정 할 수 있습니다
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
		func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
}
  • @main으로 설정한 클래스(구조체)가 UIApplicationMain의 매개변수 delegateClassName로 전달됩니다. 이를 통해 해당 객체에 delegate를 설정할 수 있습니다.
  • 기본 클래스 AppDelegate의 이름은 변경할 수 있는 요소입니다. 이를테면 CustomAppDelegate로 클래스 명을 설정하더라도 @main으로 표시되었다면 문제 없이 동작합니다.
import UIKit

func UIApplicationMain(
    _ argc: Int32,
    _ argv: UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>,
    _ principalClassName: String?,
    _ delegateClassName: String?
) -> Int32
  • @main으로 감싼 객체는 위 Boilerplate 코드를 자동으로 실행합니다.

참고

Untitled

동작

UIApplication 객체는 들어오는 사용자 이벤트를 최초로 처리합니다. 이 객체는 제어 객체(UIControl 인스턴스)가 전달한 동작 메시지를 적절한 대상으로 전송합니다.

  • UIApplication 객체는 열려 있는 창 목록(UIWindow 객체)을 관리하며, 이 목록은 앱의 UIView 객체를 탐색하는 데 사용할 수 있습니다.
  • UIApplication 객체는 UIApplicationDelegate 프로토콜을 준수하는 delegate를 정의하며 프로토콜 메서드 중 일부를 구현(및 실행)합니다.
  • UIApplication 객체는 앱 시작, 메모리 부족 경고 및 앱 종료와 같은 중요한 런타임 이벤트를 delegate 알려주어 적절하게 대응할 수 있는 기회를 제공합니다.
  • UIApplicationopen 메서드를 통해 이메일이나 이미지 파일과 같은 리소스를 처리할 수 있습니다. 예를 들어, 앱이 이메일 URL을 사용하여 open 메서드를 호출하면 메일 앱이 실행되어 메시지를 표시합니다.
  • **UIApplication 클래스의 API를 사용하면 추가적인 기기 동작을 관리할 수 있습니다.**
    • 메서드 목록
      • startIgnoringInteractionEvents(): 들어오는 터치 이벤트를 중단
      • registerForRemoteNotifications(): 원격 알림 등록
      • applicationSupportsShakeToEdit: 흔들어서 실행 취소를 Bool value로 온오프
      • canOpenURL(_:): URL 스킴을 처리할 수 있는지 확인
      • startBackgroundTask(expirationHandler:), startBackgroundTask(withName:expirationHandler:): 백그라운드에서 할 추가작업을 설정
      • scheduleLocalNotification, cancelLocalNotification: 로컬 알림을 예약하고 취소
      • startReceivingRemoteControlEvents(), endReceivingRemoteControlEvents(): 원격 제어 이벤트 수신을 조절함
      • 상태복구 작업 수행(?)

서브클래싱

🚧 대부분의 앱은 `UIApplication`을 서브 클래스 할 필요가 없습니다. 가능한 `AppDelegate`를 사용하여 시스템과 앱 간의 상호 작용을 관리하세요.
  • 앱이 시스템보다 먼저 수신 이벤트를 처리해야 하는 경우 사용자 지정 이벤트 또는 작업 디스패치 메커니즘을 구현할 수 있습니다.
  • 이를 위해선 UIApplication을 서브클래싱한 후 sendEventsendAction(:to:from:for:) 메서드를 override 합니다.
    // ex. print(event.id)
    super.sendEvent(event)

정리


  • (Xcode 12 기준) @main annotation으로 표기된 객체는 앱의 진입점으로 취급되며 UIApplicationMain을 호출합니다.**
  • UIApplicationMain을 호출 시 UIApplication의 싱글톤 객체와 AppDelegate를 설정합니다. AppDelegate 객체는 UIApplicationMain을 호출한 객체로 전달합니다.
  • UIApplication은 이벤트의 1차 처리자로서 UIWindow를 관리하고 시작, 메모리 부족, 종료 등의 중요한 런타임 이벤트를 전달하며 open 메서드를 통해 URL 이벤트를 처리할 수 있습니다.
  • 이외에도 이벤트와 앱 동작에 관한 중요한 메서드를 제공합니다.

참고


UIApplication | Apple Developer Documentation

0개의 댓글