Я сделал базовое приложение, которое позволяет пользователям регистрироваться и входить в систему.Вот код, позволяющий пользователю зарегистрироваться, и он добавляет пользователя в базу данных.Когда пользователь нажимает (нажимает) на кнопку регистрации, ему отправляется электронное письмо с подтверждением электронной почты.
var verificationTimer = Timer()
@objc func signupButtonPressed() {
// Check that the text fields aren't empty
if name.text!.isEmpty || email.text!.isEmpty || password.text!.isEmpty || countryTextField.text!.isEmpty {
let emptyFieldAlert = UIAlertController(title: "Error", message: "Please fill out all the fields.", preferredStyle: .alert)
emptyFieldAlert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.present(emptyFieldAlert, animated: true)
} else { // If none of the text fields are empty
// Create a user
func createUser(withEmail email: String, name: String, password: String, country: String) {
// Sign up user only if all the text fields are filled
Auth.auth().createUser(withEmail: email, password: password) { (result, error) in
if result != nil {
// Send an 'email verification' email to the user
Auth.auth().currentUser?.sendEmailVerification(completion: nil)
// Set a timer to call the emailverification function every second
self.verificationTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.checkIfEmailIsVerified), userInfo: nil, repeats: true)
} else {
// Error: show error message
print("Failed to sign user up with error: ", error!.localizedDescription)
let emptyFieldAlert = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
emptyFieldAlert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.present(emptyFieldAlert, animated: true)
return
}}}
createUser(withEmail: self.email.text!, name: self.name.text!, password: self.password.text!, country: self.countryTextField.text!)
Я создал таймер, который вызывает функцию каждую секунду, функция проверяет,Пользователь подтвердил свою электронную почту.И если пользователь подтвердил свою электронную почту, таймер остановится, и пользователь будет перенаправлен на главную страницу приложения.Я дал код ниже.ПРИМЕЧАНИЕ. Учетная запись пользователя будет создаваться независимо от подтверждения адреса электронной почты.
// Check if the user has verified the email
@objc func checkIfEmailIsVerified() {
Auth.auth().currentUser?.reload(completion: {(error) in
if error == nil {
if Auth.auth().currentUser!.isEmailVerified {
// Stop the timer
self.verificationTimer.invalidate()
print(self.verificationTimer)
// User verified, go to main page
let mainPage = MainScreen()
self.present(mainPage, animated: true, completion: nil)
}
}
})
}
У меня также есть функция на главной странице, которая позволяет пользователям входить в систему, если они не вышли из системы.Вот код для этого:
// Check if the user is signed in
func authenticateUserAndConfigure() {
if Auth.auth().currentUser == nil {
DispatchQueue.main.async {
// If user isn't singed in, user will be directed to the login page
self.present(LoginScreen(), animated: false, completion: nil)
}
}
}
Это работает почти идеально, проблема в том, что пользователь создается независимо от подтверждения по электронной почте, если пользователь выходит из приложения и перезапускает его после нажатия (нажатия) наЗарегистрируйтесь, не проверяя свою электронную почту, пользователь будет перенаправлен на главную страницу (последний фрагмент кода).Поэтому я хочу, чтобы пользователь был добавлен в базу данных только после того, как пользователь подтвердит свою электронную почту.