Следуя документации, я использую SwiftUI, а не Swift, который у них есть:
Код: Выделить всё
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
// Create Google Sign In configuration object.
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.configuration = config
// Start the sign in flow!
GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in
guard error == nil else {
// ...
}
guard let user = result?.user,
let idToken = user.idToken?.tokenString
else {
// ...
}
let credential = GoogleAuthProvider.credential(withIDToken: idToken,
accessToken: user.accessToken.tokenString)
// ...
}
Код: Выделить всё
func googleSignIn() {
// Configure Google Sign-In
guard let clientID = FirebaseApp.app()?.options.clientID else {
print("Failed to get clientID")
return
}
// Create a configuration with the necessary scopes
let configuration = GIDConfiguration(clientID: clientID)
// Sign in with Google
GIDSignIn.sharedInstance.signIn(
with: configuration,
presenting: getRootViewController())
{ result, error in
if let error = error {
print("Error signing in: \(error.localizedDescription)")
return
}
guard let result = result else {
print("No result found")
return
}
// Successful sign-in, retrieve ID token and access token
guard let idToken = result.user.idToken?.tokenString,
let accessToken = result.user.accessToken?.tokenString else {
print("Failed to retrieve tokens")
return
}
// Create a Firebase credential with the Google tokens
let credential = Firebase.GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
// Sign in to Firebase with the Google credential
Firebase.Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
print("Firebase sign-in error: \(error.localizedDescription)")
return
}
// Update the isLoggedIn state
DispatchQueue.main.async {
self.isLoggedIn = true
}
print("Firebase sign-in successful")
}
}
}
// Function to get the root view controller for presenting the sign-in screen
func getRootViewController() -> UIViewController {
guard let rootVC = UIApplication.shared.connectedScenes
.compactMap({ $0 as? UIWindowScene })
.first?.windows
.first(where: { $0.isKeyWindow })?.rootViewController else {
fatalError("Root view controller not set")
}
return rootVC
}
Я пытался использовать обратный вызов вместо замыкания в конце вызова, однако это привело к появлению дополнительного аргумента «обратный вызов», так что это было совершенно бесполезно.
Любая попытка обойти это также приводила к несоответствию ожидаемых значений и другим раздражающим проблемам с циклами, из-за которых я каждый раз остаюсь в одном и том же месте.
Я используя импорт Firebase и GoogleВойти.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -following
Мобильная версия