2016-09-02 66 views
4

我建設使用火力地堡的初始SignInViewController加載一個登錄頁面爲用戶提供電子郵件,其中觸發以下驗證的應用程序方法:火力地堡 - iOS設備斯威夫特: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) 
    } 
} 

一旦用戶登錄,應用程序跳至HomeScreenViewController,顯示「註銷」 「按鈕在導航欄的左上角。當用戶點擊「退出」按鈕,用戶應該就會退出該應用還應具有以下方法Segue公司回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做被稱爲?

我的代碼直接來自谷歌火力地堡斯威夫特程式碼實驗室,所以我不知道爲什麼它不工作: https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#4

+0

http://stackoverflow.com/a/39170080/6297658 – Dravidian

+0

謝謝@Dravidian,我來看看。 – alexisSchreier

+0

@Dravidian,感謝您的參考。但是,即使當我嘗試在應用程序回退到登錄頁面後在viewWillAppear(animated:Bool)方法中打印currentUser時,當前用戶也不是零。您是否說因爲.signOut()方法的異步完成,用戶在viewWillAppear(animated:Bool)方法檢查用戶是否仍然登錄之前沒有及時註銷?如果是這樣,我只有在signOut()方法成功時才確保執行當前用戶的檢查。 – alexisSchreier

回答

2

使用感嘆號不是問號。

try! FIRAuth.auth()!.signOut() 
+0

感謝您的回答@rMickeyD。我仍然得到相同的結果。我編輯我的代碼來嘗試! FIRAuth.auth()!. signOut()'就像你建議的那樣,但當viewWillAppear(animated:Bool)被調用並在'SignInViewController'中檢查用戶時,當前用戶仍然存在於緩存中。 – alexisSchreier

+0

永不強制解包('!')'try',如果你強制解包並且'signOut'確實遇到錯誤,你的應用將崩潰。例如,如果用戶沒有互聯網連接(或飛行模式),'signOut'肯定會引發錯誤,在這種情況下,您的應用肯定會崩潰。 – Annjawn

2

您可以在您的視圖控制器viewDidAppear方法添加一個偵聽器,像這樣:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in 
    if let user = user { 
     print("User is signed in.") 
    } else { 
     print("User is signed out.") 
    } 
} 

這使您可以在用戶的​​認證狀態已經改變執行代碼。它允許您監聽事件,因爲Firebase的signOut方法沒有完成處理程序。

0

我只是有什麼,我認爲是同一個問題 - 火力地堡+斯威夫特3不會對退出,留下我的應用程序想用戶仍然登錄觸發stateDidChangeListeners

什麼結束了,我的工作是保存並重用對FIRAuth.auth()實例的單個引用,而不是每次調用FIRAuth.auth()。

調用FIRAuth.auth()?.signOut()不會觸發,我以前已經連接了stateDidChangeListeners。但是,當我保存了變量並在兩種方法中重用它時,它都按預期工作。

2
GIDSignIn.sharedInstance().signOut() 
1

我其實也有這個問題。我還用Firebase提供的方法註銷了用戶(當時的情況),但當我打印到控制檯時,它表示我仍然有一個可選用戶。

我不得不改變設置當前用戶的邏輯,這樣它是由火力地堡提供的認證處理程序總是配置:

var currentUser: User? = Auth.auth().currentUser 
var handle: AuthStateDidChangeListenerHandle! 

init() { 

    handle = Auth.auth().addStateDidChangeListener { (auth, user) in 
     self.currentUser = user 

     if user == nil { 
      UserDefaults.standard.setValue(false, forKey: UserDefaults.loggedIn) 
     } else { 
      UserDefaults.standard.setValue(true, forKey: UserDefaults.loggedIn) 
     } 

    } 

} 

只要你是從這個句柄引用當前用戶,它無論身份驗證狀態如何都會更新當前用戶。

0

當firebase簽出方法可能會引發錯誤時,某些答案正在使用強制解包。不要這樣做!抓 - -

不是呼叫應在千萬要完成框如下圖所示

do { 
     try Auth.auth().signOut() 
    } catch let error { 
     // handle error here 
     print("Error trying to sign out of Firebase: \(error.localizedDescription)") 
    } 

然後,您可以使用Auth.auth()addStateDidChangeListener聽的狀態變化,並相應地處理。

相關問題