2016-07-30 59 views
2

正在處理一些FirAuth的事情,但由於某種原因,我無法弄清楚如何檢查用戶提出的電子郵件地址是否已被使用。我曾嘗試撥打.fetchProvidersForEmail,正如其他問題中提到的那樣,但無論出於何種原因,它都無法正常工作。另外,對於完成處理程序,我非常青睞,所以對此的任何建設性批評也會受到歡迎。所以,現在,我的代碼,涉及到這個部分是:如何檢查電子郵件地址是否已被使用Firebase

import UIKit 
import Firebase 
class LoginViewController: UIViewController { 
var reply : Bool = true 
@IBOutlet weak var emailTxt: UITextField! 

@IBAction func nextScreen(sender: UIButton) { 
print(emailCheck(emailTxt.text!)) 
} 

func emailCheck(input : String)->Bool{ 
    let pullEmails = FIRAuth.auth()!.fetchProvidersForEmail(input, completion:{ 
     result,error in 
     var decision : Bool = true 
     if error == "nil" { 
      print(error) 
      self.reply = true 
     }else{ 
      print(error) 
      self.reply = false 
     } 
    }) 
    return reply 
} 
} 

那麼這種情況是,答覆總是打印true,可能是因爲我明確地在上面定義到。無論哪種方式,它幾乎就好像完成處理程序不等待實際完成它的值之前returns。我試圖找出如何使用它們,以及AsyncTasks,但我想知道是否有一個簡單的錯誤,我在這裏可以解決這個問題。謝謝大家!

回答

4

這個答案花了我很長時間才發現,但在這裏。

func emailCheck(input: String, callback: (isValid: Bool) -> Void) { 
    FIRAuth.auth()?.signInWithEmail(input, password: " ") { (user, error) in 
     var canRegister = false 

     if error != nil { 
      if (error?.code == 17009) { 
       canRegister = false 
      } else if(error?.code == 17011) { 
       //email doesn't exist 
       canRegister = true 
      } 
     } 

     callback(isValid: canRegister) 
    } 
} 

此代碼工作原因很簡單。本質上,如果您將非空密碼傳遞到Firebase,即" "而不是"",則會返回某種錯誤代碼。我正在尋找的兩個最重要的返回代碼是1700917011。這是因爲如果返回17009(表示密碼錯誤),那麼我們知道已經有一個電子郵件地址與該建議的地址相關聯,所以用戶不應該能夠註冊一個新的地址。下一個代碼17011非常簡單。這意味着沒有使用該文件的用戶可以使用該電子郵件地址,該用戶可以使用該用戶的電子郵件地址。我用這個調用這個函數:

mailCheck(emailTxt.text!) { isValid in 
       if isValid { 
        print("valid") 
       } else { 
        print("Invalid!") 
       } 

,並管理這源於它的boolean。希望這可以幫助其他人在相同的情況!

+0

謝謝發佈!這很醜陋,但需要有一種方法來完成這個/以某種方式/。我感謝你分享! –

5

我試過.fetchProviders(forEmail: String, completion: FIRProviderQueryCallback?),如果在Firebase中提供了有效的電子郵件地址,它將返回密碼[String]?。如果有密碼,你知道有一個活躍的帳戶:

FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (stringArray, error) in 
      if error != nil { 
       print(error!) 
      } else { 
       if stringArray == nil { 
        print("No password. No active account") 
       } else { 
        print("There is an active account") 
       } 
      } 
     }) 

這是一個少一點的黑客,但我還沒有找到更好的。披露:我只使用密碼驗證

如果您正在創建用戶或登錄,您將收到來自回調的.emailAlreadyInUse錯誤。以下是Auth引發的所有可能的errors的列表。

相關問題