Я новичок в использовании Firebase, в настоящее время я создаю приложение для своей школы, чтобы родители могли оплачивать ежемесячный платеж через него, но я столкнулся с двумя проблемами: у меня есть ребенок (usernames / $ usernames / $ uid) , который определяет, существует ли уже пользователь, у меня есть еще один (users / details / $ uid / $ username), и этот не определяет, существует ли уже имя пользователя $, как я могу это исправить?

Другая моя проблема заключается в том, что Auth по-прежнему создает пользователя, хотя (usernames / $ usernames / $ uid) знает, что это дубликат. Как я могу заставить Auth распознавать, что пользователь уже является дубликатом, и отказываться создавать нового пользователя?

Спасибо. Мой код ниже :

@IBAction func signUp(_ sender: Any) {
        ref = Database.database().reference()

        let alert = UIAlertController(title: "Registrarse", message: "Por favor, introduce tu información", preferredStyle: .alert)

        let saveAction = UIAlertAction(title: "Crear Cuenta", style: .default) { action in
            let emailField = alert.textFields![0]
            let userField = alert.textFields![1]
            let passwordField = alert.textFields![2]

        Auth.auth().createUser(withEmail: emailField.text!, password: passwordField.text!) { user, error in
            if error != nil {

            } else {
                let uid = Auth.auth().currentUser!.uid
                let ref = Database.database().reference()
                let usersReference = ref.child("usernames")
                let values = [userField.text : uid]

                self.ref.child("users/details").child(uid).setValue(["username" : userField.text!, "email" : emailField.text!, "creationDate" : String(describing: Date())])

                usersReference.child(userField.text!).observeSingleEvent(of: .value, with: { (snapshot) in
                    if snapshot.exists() {
                        print ("taken")
                    } else {
                        print ("free")
                    }

                    usersReference.updateChildValues(values)
                }
            )}
        }
        }

        let cancelAction = UIAlertAction(title: "Cancelar", style: .default)

        alert.addTextField { textEmail in
            textEmail.placeholder = "Correo Electrónico"
        }
        alert.addTextField { userField in
            userField.placeholder = "Usuario"
        }
        alert.addTextField { textPassword in
            textPassword.isSecureTextEntry = true
            textPassword.placeholder = "Contraseña"
        }

        alert.view.transform = CGAffineTransform(translationX: 2, y: 2)
        alert.addAction(saveAction)
        alert.addAction(cancelAction)

        present(alert, animated: true, completion: nil)
    }
0
Adrian Goris S. 11 Ноя 2018 в 17:34

1 ответ

Лучший ответ
var ref: DatabaseReference { return Database.database().reference() }
var usernamesRef: DatabaseReference { return ref.child("usernames") }

Перед созданием пользователя необходимо проверить, занято ли уже имя пользователя.

func checkExistingUsernames(forUsername username: String, withExists: @escaping (Bool) -> ()) {
    usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in
        withExists(snapshot.exists())
    })
}

Затем вы можете обновить имена пользователей и данные вновь созданного пользователя.

func createUserDetails(forUser user: User, withUsername username: String, completion: @escaping (Error?) -> ()) {
    ref.updateChildValues([
        "usernames/\(username)": user.uid,
        "users/details/\(user.uid)": [
            "username" : username,
            "email" : user.email,
            "creationDate" : String(describing: Date())
        ]
    ]) { (error, ref) in
        completion(error)
    }
}

Итак, мы проверяем, существует ли уже имя пользователя, и создаем пользователя и его детали, если имя пользователя свободно.

class UsernameAlreadyExistsError: Error {}

func createUser(withUsername username: String, email: String, password: String, completion: @escaping (User?, Error?) -> ()) {
    checkExistingUsernames(forUsername: username) { [weak self] alreadyExists in
        if alreadyExists {
            completion(nil, UsernameAlreadyExistsError())
        } else {
            Auth.auth().createUser(withEmail: email, password: password) { [weak self] (result, error) in
                if let user = result?.user {
                    self?.createUserDetails(forUser: user, withUsername: username) { (error) in
                        completion(user, error)
                    }
                } else {
                    completion(nil, error)
                }
            }
        }
    }
}

Наконец, в действии сохранения вы можете вызвать createUser.

let saveAction = UIAlertAction(title: "Crear Cuenta", style: .default) { [weak self] action in
    guard
        let email = alert.textFields?[0].text,
        let username = alert.textFields?[1].text,
        let password = alert.textFields?[2].text else { return }

    self?.createUser(withUsername: username, email: email, password: password) { (user, error) in
        if let error = error {
            print("create user", error)
        } else if let user = user {
            print("user created", user)
        }
    }
}
1
Callam 11 Ноя 2018 в 15:19