Search code examples
swiftfacebookswiftuiappdelegate

SwiftUI New App lifecycle how to connect the Facebook SDK


Im creating SwiftUI application with Firebase and Facebook authentication and I have a problem with basic setup. On Facebook for Developers there is tutorial how to setup application and replace whole AppDelegate class:

import UIKit
import FBSDKCoreKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
          
        ApplicationDelegate.shared.application(
            application,
            didFinishLaunchingWithOptions: launchOptions
        )

        return true
    }
          
    func application(
        _ app: UIApplication,
        open url: URL,
        options: [UIApplication.OpenURLOptionsKey : Any] = [:]
    ) -> Bool {

        ApplicationDelegate.shared.application(
            app,
            open: url,
            sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
            annotation: options[UIApplication.OpenURLOptionsKey.annotation]
        )

    }  

}

My question is how to do the same when I'm using new life cycle with App struct:

import SwiftUI
import Firebase
import FBSDKCoreKit

@main
struct SplitApp: App {
    
    init() {
        FirebaseApp.configure()
      }
    
    var body: some Scene {
        WindowGroup {
            WelcomeView()
        }
    }
}

Do I have to use old life cycle? Thanks!


Solution

  • Add UIApplicationDelegateAdaptor to your SwiftUI App

    import SwiftUI
    import Firebase
    
    @main
    struct SplitApp: App {
        
        @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
        
        var body: some Scene {
            WindowGroup {
                WelcomeView()
            }
        }
        
        
        class AppDelegate: NSObject, UIApplicationDelegate {
            func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
                
                ApplicationDelegate.shared.application(
                    application,
                    didFinishLaunchingWithOptions: launchOptions
                )
                    
                FirebaseApp.configure()
                
                
                return true
            }
            
            
            func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
                
                ApplicationDelegate.shared.application(
                    app,
                    open: url,
                    sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                    annotation: options[UIApplication.OpenURLOptionsKey.annotation]
                )
            }
        }
    }