I'm getting this error while trying to implement G...
# ios
e
I'm getting this error while trying to implement Google authentication with Firebase:
/Users/ctrltech/StudioProjects/Tmaterials/iosApp/iosApp/FirebaseBridge.swift:37:69 Trailing closure passed to parameter of type 'String' that does not accept a closure
Here is my implementation:
Copy code
import Foundation
import FirebaseCore
import Firebase
import FirebaseAuth
import GoogleSignInSwift
import GoogleSignIn

@objc class FirebaseBridge: NSObject {
    @objc static func configureFirebase() {
        if <http://FirebaseApp.app|FirebaseApp.app>() == nil {
            FirebaseApp.configure()
        }
    }

    @objc static func isUserSignedIn() -> Bool {
        return Auth.auth().currentUser != nil
    }

    @objc static func signOut() {
        try? Auth.auth().signOut()
    }

    @objc static func signInWithGoogle(presenting: UIViewController, completion: @escaping (FirebaseUserWrapper?, Error?) -> Void) {
        guard let clientID = <http://FirebaseApp.app|FirebaseApp.app>()?.options.clientID else {
            completion(nil, NSError(domain: "NoClientID", code: 0))
            return
        }

        let config = GIDConfiguration(clientID: clientID)
        GIDSignIn.sharedInstance.signIn(withPresenting: presenting) { result in //error happens here
            switch result {
            case .success(let signInResult):
                let user = result.user
                guard let idToken = user.idToken?.tokenString else {
                    completion(nil, NSError(domain: "MissingIdToken", code: 1))
                    return
                }
                let accessToken = user.accessToken.tokenString

                guard let idToken = idToken else {
                    completion(nil, NSError(domain: "MissingIdToken", code: 1))
                    return
                }

                let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)

                Auth.auth().signIn(with: credential) { authResult, error in
                    if let error = error {
                        completion(nil, NSError(domain: error.localizedDescription, code: 1))
                    } else if let firebaseUser = authResult?.user {
                        completion(FirebaseUserWrapper(user: firebaseUser), nil)
                    } else {
                        completion(authResult?.user.uid, nil)
                    }
                }
            case .failure(let error):
                if let error = error {
                    completion(nil, error)
                    return
                }

                guard let result = result else {
                    completion(nil, NSError(domain: "GoogleSignInError", code: 1))
                    return
                }
            }
        }
    }
}

@objc class FirebaseUserWrapper: NSObject {
    let uid: String
    let email: String?
    let displayName: String?
    
    init(user: User) {
        self.uid = user.uid
        self.email = user.email
        self.displayName = user.displayName
    }
}
a
Swift sometimes points to the closure beginning, but the error might be deep inside this closure. So it looks like you have to analize all the code inside the
signIn
completion closure. You can extract code into a separated function to help the compiler find an error. One error I can see right now is:
guard let idToken = idToken else {
. idToken is already non-optional after the previous guard check. You can safely remove this condition.
e
Thks but the issue was thrown by the fact that i was using the incorrect signIn method for my needs which wasn’t expecting a closure...