본문 바로가기
Dev/iOS

[SwiftUI] iOS14 이상 신규 프로젝트에서 기존 AppDelegate 에서 수행했던 작업 수행하기

by steady.dev 2023. 4. 3.

XCode에서 Interface를 SwitfUI로 프로젝트 앱을 생성하면 기본적으로 App 프로토콜을 상속받아 WindowGroup를 사용하도록 구성되어 있습니다.

 

그렇기 때문에 기존에 Push Notification Delegate같은 작업을 사용하기 위해서는 UIApplicationDelegateAdaptor 프로퍼티 래퍼를 사용해야 합니다. 이를 사용하여 기존 UIKit 앱 델리게이트 클래스를 SwiftUI 앱에 통합할 수 있습니다. 이를 통해 UIKit으로 작성된 기존 앱 델리게이트의 기능을 활용하고 이를 SwiftUI와 함께 사용할 수 있습니다.

UIApplicationDelegateAdaptor를 사용하는 주된 이유는 SwiftUI의 앱 프로토콜에서 사용할 수 없는 앱 델리게이트 메서드 및 프로퍼티에 액세스하기 위해서입니다. 예를 들어, 앱 델리게이트 클래스에서 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)와 같은 특정 메서드를 구현한 경우, SwiftUI 앱에서 해당 메서드에 액세스하려면 @UIApplicationDelegateAdaptor를 사용해야 할 수 있습니다

 

사용 방법은 아래와 같습니다.

(AppDelegate 클래스이름은 변경해도 됨)

import SwiftUI

@main
struct Map_Watch_AppApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            MainView()
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

        return true
    }
}

 

AppDelegate class에서 NSObject 클래스를 상속받기 때문에 먼저 작성되어야 한다.

 

만약 NSObject를 상속받지 않으면 "

Cannot declare conformance to 'NSObjectProtocol' in Swift; 'AppDelegate' should inherit 'NSObject' instead" 에러가 발생하게 된다.

 

NSObject를 상속받아야 하는 이유는 UIApplicationDelegate 자체가 NSObjectProtocol을 상속하는 프로토콜이기 때문입니다.
UIApplicationDelegate는 NSObjectProtocol을 상속하기 때문에 UIApplicationDelegate를 채택하는 모든 클래스도 NSObjectProtocol을 준수해야 합니다. Swift에서 NSObjectProtocol을 준수하는 가장 쉬운 방법은 이미 NSObjectProtocol을 준수하고 Objective-C API에서 일반적으로 사용되는 몇 가지 추가 기능을 제공하는 NSObject 클래스에서 상속하는 것입니다.

(Swift에서는 NSObjectProtocol을 직접 채택할 수 없습니다. 대신 이미 NSObjectProtocol을 준수하는 NSObject 클래스에서 상속해야 합니다.)


따라서 주어진 코드에서 AppDelegate는 NSObject를 상속하여 UIApplicationDelegate와 NSObjectProtocol을 모두 준수해야 합니다. 이렇게 하면 AppDelegate 클래스가 UIKit 및 기타 Objective-C 프레임워크와 완벽하게 호환되며 iOS 앱에서 예상대로 사용할 수 있습니다.

 

댓글