Как проверить, используется ли уже адрес электронной почты Firebase

работая над некоторымиFirAuth вещи, но по какой-то причине я не могу понять, как проверить, был ли предложенный пользователями адрес электронной почты уже занят. Я пробовал звонить.fetchProvidersForEmail как предлагалось в других вопросах некоторое время назад, но по какой-то причине это просто не сработает. Кроме того, я очень зелен, когда дело доходит до обработчиков завершения, так что любая конструктивная критика по этому поводу также будет приветствоваться. Итак, на данный момент, части моего кода, которые относятся к этому:

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

Так что происходит с этим, что ответ всегда печатаетtrueВозможно, потому что я явно определил его сверху. В любом случае, похоже, что обработчик завершения не ожидает фактического завершения доreturns Значение. Я пытался выяснить, как их использовать, а такжеAsyncTasks, но мне было интересно, была ли здесь простая ошибка, которая могла бы решить эту проблему. Спасибо всем!

Ответы на вопрос(2)

Я попробовал.fetchProviders(forEmail: String, completion: FIRProviderQueryCallback?) и если указан действующий адрес электронной почты в Firebase, он вернет свой пароль в[String]?, Если есть пароль, который вы знаете, есть активная учетная запись:

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

Это немного меньше, но я не нашел ничего лучше. Раскрытие информации: я использую только аутентификацию по паролю

Если вы создаете пользователя или входите в систему, вы получите.emailAlreadyInUse ошибка от обратного вызова. Вот список всего возможногоошибки брошенныйAuth.

Решение Вопроса

Этот ответ занял у меня довольно много времени, но вот он.

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

Причина, по которой этот код работает, довольно проста. По сути, если вы передаете ненулевой пароль в Firebase, т.е." " вместо"" Вы получите какой-нибудь код ошибки назад. Два наиболее важных кода возврата, которые я ищу, это17009 а также17011, Это потому что если17009 возвращается (означает неправильный пароль), тогда мы знаем, что с этим предложенным адресом уже связан адрес электронной почты, поэтому пользователь не должен иметь возможность подписаться на новый. Следующий код,17011 довольно прямо вперед. Это означает, что в файле нет ни одного пользователя с данным адресом электронной почты, а десять из них позволяет пользователю требовать его. Я вызываю эту функцию, используя это:

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

А затем управлятьboolean это исходит из этого. Надеюсь, что это помогает другим людям в такой же ситуации!

 Brandon Konkle30 янв. 2017 г., 22:58
Спасибо за публикацию! Это некрасиво, но должен быть способ сделать это / как-нибудь /. Я ценю, что вы делитесь!

Ваш ответ на вопрос