2016-10-14 2 views
2

Ich überprüft, ob Benutzer per E-Mail verifiziert ist oder nicht. Unabhängig davon, wie viele E-Mails ich gesendet und bestätigt habe, ist der Bestätigungsstatus immer noch false. Mache ich etwas falsch, während ich es überprüfe?Firebase E-Mail-Bestätigung überprüft nicht Konto

FIRAuth.auth()?.addStateDidChangeListener({ (auth, user) in 
      if (auth.currentUser?.isEmailVerified)!{ 
       let mainStoryboard: UIStoryboard = UIStoryboard(name:"Main",bundle:nil) 

       let NewPostViewController: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "NewPostViewController") 

       //Send the user to the LoginViewController 
       self.present(NewPostViewController, animated: true, completion: nil) 
      }else{ 
       let alertVC = UIAlertController(title: "Error", message: "Sorry. Your email address has not yet been verified. Do you want us to send another verification email to \(self.currentUser.generalDetails.email).", preferredStyle: .alert) 
       let alertActionOkay = UIAlertAction(title: "Okay", style: .default) { 
        (_) in 
        FIRAuth.auth()?.currentUser?.sendEmailVerification(completion: nil) 

       } 
       let alertActionCancel = UIAlertAction(title: "Cancel", style: .default, handler: nil) 
       alertVC.addAction(alertActionOkay) 
       alertVC.addAction(alertActionCancel) 
       self.present(alertVC, animated: true, completion: nil) 
      } 
     }) 
+1

Laden Sie Ihren aktuellen Benutzer neu, nachdem Sie Ihren Benutzer verifiziert haben? – Dravidian

+0

Wie können Sie den Benutzer neu laden? Beendet die App das nicht? Wenn es meine Reputation neu lädt, dann erkennt es nicht, dass der Benutzer verifiziert ist. –

+2

Die E-Mail-bestätigte Eigenschaft wird nur neu geladen, wenn der Benutzer sich anmeldet. Wenn ich mich richtig erinnere, können Sie [erneut authentifizieren] (https://firebase.google.com/docs/reference/ios/firebaseauth/interface_f_i_r_user#afa881b98220684503c5141afbb60e83d) abrufen der aktualisierte Wert, aber ['reloadWithCompletion'] (https://firebase.google.com/docs/reference/ios/firebaseauth/interface_f_i_r_user#ac9a4e0578dcbe4abee62143fa2b25f66) klingt ebenfalls vielversprechend. –

Antwort

4

Wie ich diese Funktion implementiert war ein NSTimer, mit Zeitintervall hinzuzufügen, die, wenn der Benutzer und dann beenden Sie den Timer, wenn die Überprüfung durchgeführt wurde der Nachweis erbracht wurde, überprüfen würde.

var verificationTimer : Timer = Timer() // Timer's Global declaration 

self.verificationTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(LoginViewController.checkIfTheEmailIsVerified) , userInfo: nil, repeats: true) 

Funktion Ihres aktuellen Benutzerstatus zu überprüfen: -

func checkIfTheEmailIsVerified(){ 

    FIRAuth.auth()?.currentUser?.reload(completion: { (err) in 
     if err == nil{ 

      if FIRAuth.auth()!.currentUser!.isEmailVerified{ 

       let feedVCScene = self.navigationController?.storyboard?.instantiateViewController(withIdentifier: "ViewControllerVC_ID") as! ViewController 
       self.verificationTimer.invalidate()  //Kill the timer 
       self.navigationController?.pushViewController(feedVCScene, animated: true) 
       // Segueing to the next view(i prefer the instantiation method). 
      } else { 

       print("It aint verified yet") 

      } 
     } else { 

      print(err?.localizedDescription) 

     } 
    }) 

} 
+0

Woww .. Es funktioniert wirklich, tolle Lösung :). Aber sollte ich den Wert irgendwo speichern, damit ich die Funktion nicht jedes Mal ausführen muss, wenn ich auf eine Schaltfläche klicke? Wie auch immer, vielen Dank :) –

+0

Kein 'reload' und' FIRAuth.auth()! .currentUser! .isEmailVerified' werden das für Sie übernehmen – Dravidian

1

Mein Weg, es zu tun war ein NSNotification.Name.UIApplicationDidBecomeActive hinzuzufügen, da der Benutzer die App verlassen mußte die E-Mail zu überprüfen:

NotificationCenter.default.addObserver(self,selector:#selector(APEmailVerificationViewController.checkEmailVerificationState),name:NSNotification.Name.UIApplicationDidBecomeActive, object: nil) 

Vergessen Sie nicht, die Benachrichtigung in viewDidDisappear zu entfernen. Dies ist die APEmailVerificationViewController.checkEmailVerificationState func:

FIRAuth.auth()?.currentUser?.reload(completion: { [unowned self] (error) in 
     if error != nil { 
      print(error!.localizedDescription) 
      return 
     } 
     if !FIRAuth.auth()!.currentUser!.isEmailVerified { 
      return 
     } 

     /** 
      Great! We go the playground of the app. 
     */ 
     UIAlertView(title: "Hooray", message: "You've successfully verified your email", delegate: nil, cancelButtonTitle: "Ok").show() 
     APIntent.gotoPlayground() 
    }) 

Hoffe, es hilft!

Verwandte Themen