Как не позволить пользователю зарегистрироваться, если электронная почта не подтверждена - PullRequest
1 голос
/ 19 июня 2019

Я сделал базовое приложение, которое позволяет пользователям регистрироваться и входить в систему.Вот код, позволяющий пользователю зарегистрироваться, и он добавляет пользователя в базу данных.Когда пользователь нажимает (нажимает) на кнопку регистрации, ему отправляется электронное письмо с подтверждением электронной почты.

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

Это работает почти идеально, проблема в том, что пользователь создается независимо от подтверждения по электронной почте, если пользователь выходит из приложения и перезапускает его после нажатия (нажатия) наЗарегистрируйтесь, не проверяя свою электронную почту, пользователь будет перенаправлен на главную страницу (последний фрагмент кода).Поэтому я хочу, чтобы пользователь был добавлен в базу данных только после того, как пользователь подтвердит свою электронную почту.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Я разобрался, вот код:

// 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)
        }
    } else {

        if Auth.auth().currentUser?.isEmailVerified == false {

            DispatchQueue.main.async {
                // If user hasn't verified their email, the user will be directed to the login page
                self.present(LoginScreen(), animated: false, completion: nil)
            }

        }
    }
}

Это проверяет, подтвердил ли пользователь свою электронную почту, и если нет, он будет отключен.

0 голосов
/ 19 июня 2019

Вы должны сохранить флаг, который указывает, проверен ли пользователь или нет.Пользователь должен быть создан при регистрации, даже если он не подтвержден.Добавьте запись в User в БД isVerified и проверьте это при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...