Swift 4: Firebase все еще создает пользователя даже при ошибке?

63
6

У меня есть функция, которая запускается при нажатии кнопки регистрации, которая использует Auth.auth().createUser(withEmail: email, password: password) чтобы зарегистрировать пользователя, если у них еще нет учетной записи, или нет ошибок, Затем я добавляю их в базу данных и подписываю их. Если есть какие-либо ошибки, я показываю ошибку и return.

Однако, даже если пользователь никогда не регистрировался раньше, а база данных не имеет своей информации, я получаю ошибку .emailAlreadyInUse, после чего пользователь добавляется в базу данных в любом случае. Кажется, что Firebase создает учетную запись, а затем дает мне ошибку. Почему это и как я могу это исправить?

Вот мой код:

@IBAction func registerPressed(_ sender: Any?) {

//set up new user using Firebase
if (firstNameTextField.text! == "" && emailTextField.text! == "" && passwordTextField.text! == "") {
self.topMessage.text = "Please enter your details"
} else if (firstNameTextField.text! == "" && emailTextField.text! != "" && passwordTextField.text! != "") {
self.topMessage.text = "Please enter your first name"
} else {
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) {
(user, error) in
if error != nil {
print(error!)
if let errCode = AuthErrorCode(rawValue: error!._code) {
switch errCode {
case .weakPassword:
self.topMessage.text = "Password too short"
break
case .emailAlreadyInUse:
self.topMessage.text = "Email already in use"
break
case .invalidEmail:
self.topMessage.text = "Invalid email"
break
case .missingEmail:
self.topMessage.text = "Please enter an email"
break
default:
self.topMessage.text = "Error :( Please try again!"
break
}
}
return
}
else if let user = user {

let username = self.firstNameTextField.text!
let name = self.firstNameTextField.text!
let email = self.emailTextField.text!
let profileImage = ""
let password = self.passwordTextField.text!

let newUser = User(uid: user.uid, username: username, name: name, profileImage: profileImage, email: email, userCoins: 0, questsComplete: 0, rewardsRedeemed: 0, streak: 0, isSubscribed: false)

newUser.save(completion: { (error) in
if error != nil {
print(error!)
} else {
//successfully initialised
Auth.auth().signIn(withEmail: email, password: password, completion: { (user, error) in
if let error = error {
print(error)
} else {
self.performSegue(withIdentifier: "registerToMainMap", sender: self)
}
})

}
})

}

}
}
}

спросил(а) 2018-01-17T00:07:00+03:00 1 год, 10 месяцев назад
2
Решение
71

Согласно документации документации Firebase об ошибках

FIRAuthErrorCodeEmailAlreadyInUse Указывает, что письмо, используемое для попытки регистрации, уже существует. Вызовите fetchProvidersForEmail, чтобы проверить, какие механизмы входа в систему используются таким пользователем, и предложите пользователю войти в систему с одним из них.

Итак, что вам нравится?

Auth.auth().fetchProviders(forEmail: emailTextField.text!) { (email,completion) in
print("email is ", email!)
print("completion is ", completion!)
}

ответил(а) 2018-01-17T01:12:00+03:00 1 год, 10 месяцев назад
Еще 1 ответ
32

Выяснил мою проблему. Функция .save() имела встроенный в нее .saveProfileImage(), который запускался при регистрации пользователя. Я прокомментировал эту функцию, поскольку я реализовал сохранение изображений по-другому. Однако в этом .saveProfileImage() было completion(error) которое также было закомментировано, поэтому создание func save(completion: @escaping (Error?) → Void) {} не работает. Я просто превратил его в func save() чтобы исправить это.

Здесь старая функция save():

func save(completion: @escaping (Error?) -> Void) {

let ref = AppDatabaseReference.users(uid: uid).reference()
ref.setValue(toDictionary())

//save the user profile image
if let profileImage = self.profileImage {
let firImage = FirebaseImage(image: profileImage)
firImage.saveProfileImage(uid, { (error) in
//called when profile image is successfully uploaded
completion(error)
})
}
}

.saveProfileImage():

func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {

let resizedImage = image.resize()
if let imageData = UIImageJPEGRepresentation(resizedImage, 0.9) {
//get the reference
ref = AppStorageReference.profileImages.reference().child(userUID)
downloadURLString = ref.description

//save data to reference
ref.putData(imageData, metadata: nil, completion: { (metaData, error) in
completion(error)
})
}

}

и что сохранили пользователя после регистрации:

else if let user = user {

let username = self.firstNameTextField.text!
let name = self.firstNameTextField.text!
let email = self.emailTextField.text!
let profileImage = ""
let password = self.passwordTextField.text!

let newUser = User(uid: user.uid, username: username, name: name, profileImage: profileImage, email: email, userCoins: 0, questsComplete: 0, rewardsRedeemed: 0, streak: 0, isSubscribed: false)

newUser.save(completion: { (error) in
if error != nil {
print(error!)
} else {
//successfully initialised
Auth.auth().signIn(withEmail: email, password: password, completion: { (user, error) in
if error != nil {
print(error!)
} else {
print("segue to perform")
self.performSegue(withIdentifier: "registerToMainMap", sender: self)
}
})

}
})

}

Новое save():

func save() {
let ref = AppDatabaseReference.users(uid: uid).reference()
ref.setValue(toDictionary())
}

Сохранение пользователя:

else if let user = user {

let username = self.firstNameTextField.text!
let name = self.firstNameTextField.text!
let email = self.emailTextField.text!
let profileImage = ""
let password = self.passwordTextField.text!

let newUser = User(uid: user.uid, username: username, name: name, profileImage: profileImage, email: email, userCoins: 0, questsComplete: 0, rewardsRedeemed: 0, streak: 0, isSubscribed: false)

newUser.save()
//successfully initialised
Auth.auth().signIn(withEmail: email, password: password, completion: { (user, error) in
if error != nil {
print(error!)
} else {
print("segue to perform")
self.performSegue(withIdentifier: "registerToMainMap", sender: self)
}
})

}

ответил(а) 2018-01-17T16:19:00+03:00 1 год, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема