😊
SwiftUIでAppDelegateを使う
SwiftUI
のライフサイクルにするとUIApplicationDelegate
がなくなるので、ソースコードがすっきりと見やすくなります。
しかし、Push通知などの一部の機能についてはUIApplicationDelegate
を使う必要があります。この記事では、SwiftUI
ベースのプロジェクトでPush通知用のトークンを取得するまでの実装を書きます。
SwiftUIでUIApplicationDelegateを使うためには
UIApplicationDelegateAdaptorを使います。
@propertyWrapper struct UIApplicationDelegateAdaptor<DelegateType> where DelegateType : NSObject, DelegateType : UIApplicationDelegate
@propertyWrapper
があるので、SwiftUIでは@
で指定することで使用できます。また、DelegateTyp
はNSObject
, 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