2016-07-30 2 views
2

fonctionne sur certaines choses, mais pour une raison quelconque, je ne peux pas comprendre comment vérifier si l'adresse e-mail proposée par les utilisateurs a déjà été prise. J'ai essayé d'appeler .fetchProvidersForEmail comme suggéré dans d'autres questions depuis un certain temps, mais pour une raison quelconque, cela ne marchera pas. De plus, je suis très vert en ce qui concerne les gestionnaires de complétion, donc toute critique constructive serait la bienvenue. Donc, pour l'instant, les parties de mon code qui se rapportent à ce sont:Comment vérifier si une adresse e-mail est déjà utilisée 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 
} 
} 

Alors ce qui se passe avec ceci est que la réponse imprime toujours true, probablement parce que je explicitement défini à au sommet. Dans les deux cas, c'est presque comme si le gestionnaire d'achèvement n'attendait pas d'être complété avant d'avoir la valeur returns. J'ai essayé de comprendre comment les utiliser, ainsi que AsyncTasks, mais je me demandais s'il y avait une erreur simple que j'ai faite ici qui pourrait résoudre ce problème. Merci à tous!

Répondre

4

Cette réponse a pris pas mal de temps à trouver, mais la voici.

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) 
    } 
} 

La raison pour laquelle ce code fonctionne est assez simple. Essentiellement, si vous passez un mot de passe non nul dans Firebase, c'est-à-dire " " au lieu de "", vous obtiendrez une sorte de code d'erreur. Les deux principaux codes de retour que je cherche est 17009 et 17011. En effet, si 17009 est renvoyé (indiquant un mot de passe erroné), alors nous savons qu'une adresse e-mail est déjà associée à cette adresse proposée. Par conséquent, l'utilisateur ne devrait pas être en mesure d'en créer un nouveau. Le code suivant, 17011 est assez simple. Cela signifie qu'il n'y a pas d'utilisateur dans le fichier avec cette adresse email donnée, qui permet à l'utilisateur de le réclamer. J'appelle cette fonction en utilisant ceci:

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

et gérer ensuite le boolean qui vient de lui. J'espère que cela aide d'autres personnes dans la même situation!

+0

Merci d'avoir posté ce message! C'est moche, mais il doit y avoir un moyen d'accomplir ceci/en quelque sorte /. Je vous remercie de partager! –

5

J'ai essayé le .fetchProviders(forEmail: String, completion: FIRProviderQueryCallback?) et si fourni une adresse email valide dans Firebase il retournera son mot de passe dans un [String]?. S'il y a un mot de passe, vous savez qu'il ya un compte actif:

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") 
       } 
      } 
     }) 

Ceci est un peu moins d'un hack mais je ne trouve rien de mieux. Divulgation: J'utilise uniquement l'authentification par mot de passe

Si vous créez un utilisateur ou que vous vous connectez, vous recevrez une erreur .emailAlreadyInUse du rappel. Voici la liste de tous les possibles errors lancés par Auth.