Я создал приложение, в котором, когда пользователь регистрируется, он должен создать два значения на сервере Firestore в пользовательском документе, то есть уровень и темы (имеется в виду, что он находится в /users/userid).
Я пытался вручную создать коллекцию пользователей, но при регистрации пользователя ничего не создается.
Ниже приведен мой код (SignUpViewController):
import Firebase
var reference: DocumentReference!
func firebaseAuth() {
let userDisplayName = textfieldDisplayName.text!
let userEmail = textfieldEmail.text!
let userPassword = textfieldPassword.text!
if userEmail == "" || userPassword == "" {
labelMessage.isHidden = false
labelMessage.textColor = UIColor.red
labelMessage.text = "Error: A compulsory field is left blank."
} else {
Auth.auth().createUser(withEmail: userEmail, password: userPassword) { (user, error) in
if user != nil && error == nil {
let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
changeRequest?.displayName = userDisplayName
changeRequest?.commitChanges(completion: { (error) in
if error == nil {
let userID = Auth.auth().currentUser?.uid
let dataToSave: [String: Any] = ["level":0, "subjects":[""]]
self.reference = Firestore.firestore().collection("users").document(userID ?? "")
self.reference.setData(dataToSave, completion: { (error) in
if error == nil {
self.performSegue(withIdentifier: "presentInitial", sender: self)
} else {
self.labelMessage.isHidden = false
self.labelMessage.textColor = UIColor.red
self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
}
})
self.performSegue(withIdentifier: "presentInitial", sender: self)
} else {
self.labelMessage.isHidden = false
self.labelMessage.textColor = UIColor.red
self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
}
})
} else {
self.labelMessage.isHidden = false
self.labelMessage.textColor = UIColor.red
self.labelMessage.text = "Error: \(error?.localizedDescription ?? "")"
}
}
}
}
Следующий код взят из другого контроллера представления, на который SignUpViewController перенаправляется (HomeViewController):
import Firebase
var reference: DocumentReference!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let userID = Auth.auth().currentUser?.uid
reference.getDocument { (docSnapshot, error) in // Fatal error occured here
let data = docSnapshot?.data()
let userLevel = data?["level"] as? String ?? ""
if userLevel == "" {
self.performSegue(withIdentifier: "performSetup", sender: self)
}
}
}
Я ожидал, что при перенаправлении на домашнюю страницу (переход через presentInitial) домашняя страница будет читать значение «уровень». Однако приложение вышло из строя с фатальной ошибкой: «Фатальная ошибка: неожиданно найдено nil при неявном развертывании необязательного значения», где «уровень» должен был быть прочитан с сервера.





Вы проверяли правила своей базы данных? вам нужно настроить правила, когда работать, а когда нет, чтобы никто не мог получить доступ к базе данных, кроме ваших приложений для теста теперь используйте этот код, чтобы убедиться, что он работает, тогда вы должны изменить его
{
"rules": {
".read": true,
".write": true
}
}
Мои правила базы данных кажутся хорошими; разрешено как чтение, так и запись.
Чтобы было ясно, когда вы регистрируетесь, вы видите свою зарегистрированную учетную запись на вкладке «Аутентификация»?
Да, пользователь записан на вкладке Аутентификация.
Попробуйте эту строку из документов firebase, я думаю, что у вас неправильный код записи self.ref.child("users").child(user.uid).setValue(["username": username])
Я пробовал это, но это для базы данных реального времени; Firestore, я считаю, отличается.
Я думаю, что проблема не в Firestore. Судя по сообщению об ошибке, код переносит необязательное значение, но не удалось, потому что это nil, поэтому проблема, вероятно, связана с этими тремя строками:
let userDisplayName = textfieldDisplayName.text!
let userEmail = textfieldEmail.text!
let userPassword = textfieldPassword.text!
Иногда, когда у UITextField нет текста, его text — это nil вместо "", что может вызвать проблему. Вы можете заменить эти три строки на следующие:
let userDisplayName = textfieldDisplayName.text ?? ""
let userEmail = textfieldEmail.text ?? ""
let userPassword = textfieldPassword.text ?? ""
Таким образом, эти три переменные всегда будут "", когда нет текста, и ваша логика проверки пустых полей все равно будет работать.
Обновлено: для дальнейшего использования настоящая проблема не в вопросе, а в комментариях к этому ответу.
Ошибка произошла в другом контроллере представления, я забыл упомянуть об этом ранее. Пожалуйста, смотрите обновленный вопрос; Извините за недопонимание!
Что такое reference? Вы использовали переменную uid при инициализации reference?
reference — это переменная, как показано в коде как var reference: DocumentReference!.
DocumentReference! называется неявно развернутый необязательный. Если вы не инициализируете reference, он останется nil. Он пытается развернуться в DocumentReference, но это nil, поэтому приложение вылетает.
Я изменил часть кода, и теперь он работает. Большое спасибо за Вашу помощь!
Привет, я только что нашел это, похоже, нет? stackoverflow.com/questions/32170456/…