😊

SwiftUIでAppDelegateを使う

2022/02/01に公開

SwiftUIのライフサイクルにするとUIApplicationDelegateがなくなるので、ソースコードがすっきりと見やすくなります。
しかし、Push通知などの一部の機能についてはUIApplicationDelegateを使う必要があります。この記事では、SwiftUIベースのプロジェクトでPush通知用のトークンを取得するまでの実装を書きます。

SwiftUIでUIApplicationDelegateを使うためには

UIApplicationDelegateAdaptorを使います。

@propertyWrapper struct UIApplicationDelegateAdaptor<DelegateType> where DelegateType : NSObject, DelegateType : UIApplicationDelegate

@propertyWrapperがあるので、SwiftUIでは@で指定することで使用できます。また、DelegateTypNSObject, UIApplicationDelegateに準拠している必要があります。この2つはUIKitの時によく見るAppDelegateで使われていますね。

実装

使い方は以下のようになります。

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

import UIKit

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

        return true
        
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        
        debugPrint(deviceToken.base64EncodedString())
        
    }

		...

このコードを実行してみると、application:didFinishLaunchingWithOptionsが呼ばれます。また、Push通知も登録しているので、application:didRegisterForRemoteNotificationsWithDeviceTokenも呼ばれます。

Discussion