I checked if user is verified via email or not. However, no matter how many emails I sent and confirm, the verification status is still false
. Am I doing something wrong while checking it?
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)
}
})
How i implemented this feature was to add a NSTimer
, with time interval which would check if the user has been verified and then terminate the timer when the verification was done.
var verificationTimer : Timer = Timer() // Timer's Global declaration
self.verificationTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(LoginViewController.checkIfTheEmailIsVerified) , userInfo: nil, repeats: true)
Function to check your current user state:-
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)
}
})
}
My way to do it was to add a NSNotification.Name.UIApplicationDidBecomeActive
because the user had to leave the app to verify the email:
NotificationCenter.default.addObserver(self,selector:#selector(APEmailVerificationViewController.checkEmailVerificationState),name:NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
Do not forget to remove the notification in viewDidDisappear
. This is the 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()
})
Hope it helps!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.