Я успешно настроил аутентификацию в своем приложении, используя Google Sign-In, где я могу вернуть пользователя Firebase. Я пытаюсь настроить экран входа, который отображается только при отсутствии аутентифицированного пользователя Firebase, однако с моим текущим кодом экран входа всегда виден, даже если я постоянно возвращаю аутентифицированного пользователя.
Я реализовал функцию didSignInFor
в AppDelegate
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
// ...
if let error = error {
print(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
}
let session = FirebaseSession.shared
if let user = Auth.auth().currentUser {
session.user = User(uid: user.uid, displayName: user.displayName, email: user.email)
print("User sign in successful: \(user.email!)")
}
}
}
а также несколько строк в didFinishLaunchingWithOptions
, которые устанавливают свойство isLoggedIn
моего ObservableObject
FirebaseSession
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
let auth = Auth.auth()
if auth.currentUser != nil {
FirebaseSession.shared.isLoggedIn = true
print(auth.currentUser?.email!)
} else {
FirebaseSession.shared.isLoggedIn = false
}
//Cache
let settings = FirestoreSettings()
settings.isPersistenceEnabled = false
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
}
My ObservableObject
class FirebaseSession: ObservableObject {
static let shared = FirebaseSession()
init () {}
//MARK: Properties
@Published var user: User?
@Published var isLoggedIn: Bool?
@Published var items: [Thought] = []
var ref: DatabaseReference = Database.database().reference(withPath: "\(String(describing: Auth.auth().currentUser?.uid ?? "Error"))")
//MARK: Functions
func listen() {
_ = Auth.auth().addStateDidChangeListener { (auth, user) in
if auth.currentUser != nil {
self.isLoggedIn = true
}
if let user = user {
self.user = User(uid: user.uid, displayName: user.displayName, email: user.email)
} else {
self.user = nil
}
}
}
}
Наконец, я выполняю проверку аутентификации в главном представлении моего приложения здесь, получая доступ к FirebaseSession
через мой ObservedObject
struct AppView: View {
@ObservedObject var session = FirebaseSession.shared
@State var modalSelection = 1
@State var isPresentingAddThoughtModal = false
var body: some View {
NavigationView {
Group {
if session.isLoggedIn == true {
ThoughtsView()
} else {
SignInView()
}
}
}
}
}
Как упоминалось выше, мой чек не работает. Несмотря на то, что мой пользователь аутентифицирован, SignInView
всегда виден.
Как я могу успешно проверять аутентификацию пользователя каждый раз, когда мое приложение загружается?
ОБНОВЛЕНИЕ
Теперь я могу проверить аутентификацию при загрузке приложения, но после внедрения решения Сохила я не наблюдаю изменений в реальном времени в моем ObservableObject
FirebaseSession
. Я хочу наблюдать за изменениями в FirebaseSession
, чтобы после входа нового пользователя тело AppView
было перерисовано и отображало ThoughtsView
вместо SignInView
. В настоящее время мне нужно перезагрузить приложение, чтобы проверка произошла после аутентификации.
Как я могу наблюдать изменения в FirestoreSession
по сравнению с AppView
?