Я использую вход в Google через Firebase (IOS / Swift), и в целом все работает, за исключением того момента, когда я вышел из аккаунта Google и не могу войти ... Я не даже получить сообщение об ошибке, как будто функция входа не выполняется. Это происходило целую вечность, и вдруг я мог снова войти в систему, поэтому я попытался выйти, и теперь я не могу войти.
Я заметил, что Firebase изменил документацию, это что-то что с этим делать? Я тоже это пробовал, но тоже не получилось.
Документы Firebase: https://firebase.google.com/docs/auth/ios/google-signin
Любая помощь приветствуется!
Вот реализация входа в Google в моем делегате приложения -
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
}
И
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
if let error = error {
print("Something went wrong \(error.localizedDescription)")
return
}
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
Auth.auth().signIn(with: credential) { (authResult, error) in
if let error = error {
print(error.localizedDescription)
return
}
// User is signed in
print("App delegate signed in ")
}
}
Мой контроллер просмотра, который входит в систему пользователя, реализует вход в Google. Я расширяю контроллер представления с помощью GIDSignInDelegate, как это -
@IBAction func googleSignInTapped(_ sender: Any) {
//performSegue(withIdentifier: "homeFromGSignIn", sender: self)
GIDSignIn.sharedInstance().signIn()
}
}
и - я вызываю делегат GIDSignin и представляющий контроллер, а также проверяю, вошел ли пользователь в систему в данный момент ... так что я могу войти в систему пользователей автоматически при загрузке приложения.
override func viewDidLoad() {
super.viewDidLoad()
setUpElements()
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance()?.presentingViewController = self
Auth.auth().addStateDidChangeListener { (auth, user) in
if user == nil {
// prompt user to sign in
print("No user here ")
} else {
self.performSegue(withIdentifier: "LoginToHome", sender: self)
}
}
}
и
extension ViewController: GIDSignInDelegate {
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
// ...
if let error = error {
print("Something went wrong \(error.localizedDescription)")
return
}
let db = Firestore.firestore()
guard let firstName = user.profile.givenName else { return }
guard let secondName = user.profile.familyName else { return }
guard let userUID = Auth.auth().currentUser?.uid else { return }
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
Auth.auth().signIn(with: credential) { (authResult, error) in
if let error = error {
print(error.localizedDescription)
return
}
db.collection("users").document(userUID).setData(["firstName": firstName, "lastName": secondName, "uid": userUID]) { (error) in
if error != nil {
print("User data couldn't save ")
}}
self.performSegue(withIdentifier: "LoginToHome", sender: self)//
print("changed segue from view controller ")
print("signed in ")
}
}
}
и, наконец, мои настройки для моего контроллера представления, который регистрирует пользователей, выглядят так -
@IBAction func signOutButtonTapped(_ sender: Any) {
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
GIDSignIn.sharedInstance().signOut()
performSegue(withIdentifier: "SettingsToLogin", sender: nil)
print("Signed out")
} catch let signOutError as NSError {
print ("Error signing out: %@", signOutError)
}
}
}
Большое спасибо!