Swift / Firebase - проверьте, вошел ли пользователь в систему через Facebook и Google - PullRequest
0 голосов
/ 19 июня 2020

Я использую объект среды CurrentSession для хранения информации о пользователе. Пользователь может войти в приложение через Google или Facebook. Я хочу, чтобы пользователь вошел в систему даже после закрытия и повторного открытия приложения. Поэтому я собирался проверить c объектов / переменных, указанных поставщиком, для выполнения этих проверок. Хорошо работает для FB, но, к сожалению, не работает для Google (!)

Поэтому я вхожу в систему через Facebook или Google и закрываю приложение ..

Когда я запустить мое приложение снова инициализируется CurrentSession. Я проверяю, был ли пользователь уже авторизован, и это хорошо работает для Facebook, выполнив проверку AccessToken.current! = Nil .

Но как только я делаю то же самое для пользователя, вошедшего в систему через Google, когда я перезапускаю приложение GIDSignIn.sharedInstance () ?. currentUser всегда равен нулю; (

Как мне выполнить эту проверку для пользователя Google? Я знаю, что могу использовать Auth.auth (), но в данный момент я ищу способ сделать это с помощью объекта GIDSignIn ..

import Combine
import FirebaseCore
import FirebaseAuth
import GoogleSignIn
import FBSDKLoginKit
import FBSDKCoreKit

class CurrentSession: ObservableObject {
    @Published var userId: String? = nil

    init() {

        // check if user logged via Facebook
        if AccessToken.current != nil { <-- WORKS WELL FOR FACEBOOK

            let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)

            Auth.auth().signIn(with: credential) { (res,er) in

                if er != nil{
                    print((er?.localizedDescription)!)
                    return

                }
                print("email: \(String(describing: res?.user.email))")
                print("name: \(String(describing: res?.user.displayName))")

                DispatchQueue.main.async {
                    self.userId = String(describing: res?.user.displayName)
                }
            }
        }

        // check if user logged via Google
        if let user = GIDSignIn.sharedInstance()?.currentUser, let authentication = user.authentication { <<-- HERE (CHECK DOESN'T WORK AS I EXPECT)

                let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                               accessToken: authentication.accessToken)
                Auth.auth().signIn(with: credential) { (res, err) in

                    if err != nil {
                        print("\(String(describing: err?.localizedDescription))")
                        return
                    }

                    print("email: \(String(describing: res?.user.email))")
                    print("name: \(String(describing: res?.user.displayName))")

                    DispatchQueue.main.async {
                        self.userId = String(describing: res?.user.displayName)
                    }

                }
        } else {
            print("No current user found")
        }


    }
}

1 Ответ

0 голосов
/ 19 июня 2020

Кажется, я нашел решение.

Вот код, который выполняет эти проверки:

if let signIn = GIDSignIn.sharedInstance(), signIn.hasPreviousSignIn() {
          signIn.restorePreviousSignIn()
            DispatchQueue.main.async {
                self.userId = String(describing: GIDSignIn.sharedInstance()?.currentUser.userID)
                print("userId = self.userId")
            }
        } else {
            print("ATTEMPT FAILED")
        }
}
...