Я создаю приложение с использованием Firebase с начальным SignInViewController
, которое загружает страницу входа для проверки подлинности с помощью электронной почты, которая запускает следующие методы:Firebase - iOS Swift: FIRAuth.auth(). SignOut() не выписывает текущего пользователя
@IBAction func didTapSignIn(sender: AnyObject) {
let email = emailField.text
let password = passwordField.text
FIRAuth.auth()?.signInWithEmail(email!, password: password!) { (user, error) in
if let error = error {
print(error.localizedDescription)
return
}
self.signedIn(user!)
}
}
func signedIn(user: FIRUser?) {
AppState.sharedInstance.displayName = user?.displayName ?? user?.email
AppState.sharedInstance.signedIn = true
NSNotificationCenter.defaultCenter().postNotificationName(Constants.NotificationKeys.SignedIn, object: nil, userInfo: nil)
performSegueWithIdentifier(Constants.Segues.SignInToHome, sender: nil)
}
SignInViewController
также проверяет, есть ли в кэше текущего пользователя, когда приложение запускает и, если да, то признаки того, что пользователь в:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
//Synchronously gets the cached current user, or null if there is none.
if let user = FirebaseConfigManager.sharedInstance.currentUser {
self.signedIn(user)
}
}
После того как пользователь вошел в систему, что приложение segues на HomeScreenViewController
, на котором отображается «Выйти "в левом верхнем углу панели навигации. Когда пользователь нажимает на кнопку «Выход», что пользователь должен подписать контракт, и приложение должно непосредственно перейти обратно к SignInViewController
со следующим методом:
@IBAction func didTapSignOut(sender: UIBarButtonItem) {
print("sign out button tapped")
let firebaseAuth = FIRAuth.auth()
do {
try firebaseAuth?.signOut()
AppState.sharedInstance.signedIn = false
dismissViewControllerAnimated(true, completion: nil)
} catch let signOutError as NSError {
print ("Error signing out: \(signOutError)")
} catch {
print("Unknown error.")
}
}
Когда я нажимаю кнопку «Выход», метод didTapSignOut
вызывается и выполняется. Однако после того, как будет выполнена строка кода try firebaseAuth?.signOut()
, текущий пользователь должен быть nil
. Но когда я распечатать текущий пользователь в консоли Xcode, текущий пользователь все еще находится в:
po FIRAuth.auth()?.currentUser
▿ Optional<FIRUser>
- Some : <FIRUser: 0x7fde43540f50>
Поскольку текущий пользователь не получает выписался после firebaseAuth?.signOut()
вызывается, когда приложение перетекает обратно в SignInViewController
приложение по-прежнему считает, что текущий пользователь кэширован, чтобы пользователь снова подписался.
Это может быть проблема с брелками?
Связано ли это с NSNotificationCenter.defaultCenter().postNotificationName
?
Мой код поступает непосредственно от Google Firebase Swift Codelab, так что я не знаю, почему это не работает: https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#4
http://stackoverflow.com/a/39170080/6297658 – Dravidian
Спасибо @ Дравидиану, я посмотрю. – alexisSchreier
@ Дравидий, спасибо за ссылку. Однако даже когда я пытаюсь распечатать currentUser в методе viewWillAppear (анимированный: Bool) после того, как приложение перейдет на страницу входа, текущий пользователь не равен нулю. Вы говорите, что из-за асинхронного завершения метода .signOut() пользователь не получает вход вовремя до того, как метод viewWillAppear (анимированный: Bool) проверяет, включен ли этот пользователь? Если да, то как я должен выполнить проверку для текущего пользователя ** только если ** метод signOut() был успешным? – alexisSchreier