😊
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