2016-07-30 9 views
2

いくつかの作業を行っていますが、ユーザが電子メールアドレスを提案したかどうかを確認する方法がわかりません。私は.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に非ヌルパスワードを渡すと、つまり""の代わりに" "の代わりに、何らかのエラーコードが返されます。私が探している2つの最も重要なリターンコードは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というエラーが表示されます。可能なすべてのerrorsのリストはAuthです。

関連する問題