모든 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
객체를 생성합니다.principalClassName
: UIApplication
클래스 또는 서브클래스의 이름입니다. 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 코드를 자동으로 실행합니다.참고
UIApplication
객체는 들어오는 사용자 이벤트를 최초로 처리합니다. 이 객체는 제어 객체(UIControl
인스턴스)가 전달한 동작 메시지를 적절한 대상으로 전송합니다.
UIApplication
객체는 열려 있는 창 목록(UIWindow
객체)을 관리하며, 이 목록은 앱의 UIView
객체를 탐색하는 데 사용할 수 있습니다.UIApplication
객체는 UIApplicationDelegate
프로토콜을 준수하는 delegate
를 정의하며 프로토콜 메서드 중 일부를 구현(및 실행)합니다.UIApplication
객체는 앱 시작, 메모리 부족 경고 및 앱 종료와 같은 중요한 런타임 이벤트를 delegate
알려주어 적절하게 대응할 수 있는 기회를 제공합니다.UIApplication
은 open
메서드를 통해 이메일이나 이미지 파일과 같은 리소스를 처리할 수 있습니다. 예를 들어, 앱이 이메일 URL을 사용하여 open
메서드를 호출하면 메일 앱이 실행되어 메시지를 표시합니다.**UIApplication
클래스의 API를 사용하면 추가적인 기기 동작을 관리할 수 있습니다.**startIgnoringInteractionEvents()
: 들어오는 터치 이벤트를 중단registerForRemoteNotifications()
: 원격 알림 등록applicationSupportsShakeToEdit
: 흔들어서 실행 취소를 Bool value로 온오프canOpenURL(_:)
: URL 스킴을 처리할 수 있는지 확인startBackgroundTask(expirationHandler:)
, startBackgroundTask(withName:expirationHandler:)
: 백그라운드에서 할 추가작업을 설정scheduleLocalNotification
, cancelLocalNotification
: 로컬 알림을 예약하고 취소startReceivingRemoteControlEvents()
, endReceivingRemoteControlEvents()
: 원격 제어 이벤트 수신을 조절함UIApplication
을 서브클래싱한 후 sendEvent
및 sendAction(:to:from:for:)
메서드를 override
합니다.// ex. print(event.id)
super.sendEvent(event)
@main
annotation으로 표기된 객체는 앱의 진입점으로 취급되며 UIApplicationMain
을 호출합니다.**UIApplicationMain
을 호출 시 UIApplication
의 싱글톤 객체와 AppDelegate
를 설정합니다. AppDelegate
객체는 UIApplicationMain
을 호출한 객체로 전달합니다.UIApplication
은 이벤트의 1차 처리자로서 UIWindow
를 관리하고 시작, 메모리 부족, 종료 등의 중요한 런타임 이벤트를 전달하며 open 메서드를 통해 URL 이벤트를 처리할 수 있습니다.