При использовании электронной почты при входе в систему нового пользователя или создании нового пользователя существует 2 разных метода подписи. При создании нового пользователя, если электронная почта уже существует, будет возвращена ошибка или при входе пользователя в систему, если электронная почта не существует, будет возвращена ошибка:
// create account
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (authDataResult, error)
if let error = error {
// if this email address already exists an error will be returned
return
}
})
// login
Auth.auth().signIn(withEmail: emailTextField.text!, password: self.passwordTextField.text!, completion: { (authDataResult, error) in
if let error = error {
// if this email address isn't inside the system then an error will be returned
return
}
})
Но при использовании номера телефона пользователя для войдите или создайте новую учетную запись. Я должен использовать одну и ту же сигнатуру метода для обеих ситуаций.
func loginExistingUserOrCreateNewOne(phoneNumber: String, verificationCode: String) {
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
if let error = error { return }
guard let verificationId = verificationID else { return }
let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: verificationCode)
Auth.auth().signIn(with: credential, completion: { (authDataResult, error) in
guard let authUser = authDataResult else { return }
let checkUsersRef = Database.database().reference().child("users").child(authUser.user.uid)
checkExistingUsersRef.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() {
// this is a new user, now add them to the users ref
let newUserDict = ["signupDate": Date().timeIntervalSince1970]
checkUsersRef.updateChildValues(newUserDict, withCompletionBlock: { (error, ref) in
if let error = error {
// because there is an error this ref was never updated so now I have to sign this user out and they have to start over agin
do {
try Auth.auth().signOut()
} catch let err as NSError {
// alert user there is a major problem
}
return
}
// if no error let them go to HomeVC
})
return
}
// this is a previous user fetch dict data and let them proceed to HomeVC
guard let previousUserDict = snapshot.value as? [String: Any] else { return }
// get newUserDict values and let them go to HomeVC
})
})
}
}
Если у пользователя уже есть учетная запись, мне нужно получить некоторые данные от пользователя ref, а затем я позволю они переходят к HomeV C. Если пользователь никогда не регистрировался ранее, я должен добавить их в ссылку на пользователя и затем позволить им продолжить. Это двухэтапный процесс.
Проблема в том, что эти дополнительные шаги кажутся ненужными. Например, при использовании знака электронной почты или имени входа возвращается ошибка, поэтому нет необходимости создавать и проверять внутри другого ссылки, чтобы увидеть, существует ли это письмо.
Вне процесса, использованного в приведенном выше коде, Есть ли другой способ определить, существует ли номер телефона перед созданием новой учетной записи или его нет при входе в систему?