首页 > 解决方案 > 注册流程到错误的视图控制器并且也不写入firestore

问题描述

所以我的目标是让正确的用户注册并显示正确的 segue 以及将用户信息写入 Firestore。所以我有一个基本的注册功能,当按下注册按钮时会触发它:

@IBAction func schoolSignupPressed(_ sender: UIButton) {
    let validationError = validateFields()
    let schoolName = schoolNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let schoolEmail = schoolEmailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let schoolPassword = schoolPasswordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let schoolID = schoolIDTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let schoolDistrict = schoolDistrictTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let dateCreated = Date()
    
    if validationError != nil {
        return
    }
    
    Auth.auth().createUser(withEmail: schoolEmail, password: schoolPassword) { (result, error) in
        guard let signUpError = error?.localizedDescription else { return }
        
        guard error == nil else {
            self.showAlert(title: "Error Signing Up", message: "There was an error creating the user. \(signUpError)")
            return
        }
        
        let db = Firestore.firestore()
        guard let result = result else { return }
        db.document("school_users/\(result.user.uid)").setData(["school_name":schoolName,
                                                                "school_id":schoolID,
                                                                "emailAddress": result.user.email ?? schoolEmail,
                                                                "remindersPushNotificationsOn": true,
                                                                "updatesPushNotificationsOn": true,
                                                                "schoolDistrict":schoolDistrict,
                                                                "time_created":dateCreated,
                                                                "userID": result.user.uid],
                                                               merge: true) { (error) in
            guard let databaseError = error?.localizedDescription else { return }
            guard error == nil else {
                self.showAlert(title: "Error Adding User Info", message: "There was an error adding the user info. \(databaseError)")
                return
            }
        }
        
        let changeRequest = result.user.createProfileChangeRequest()
        changeRequest.displayName = schoolName
        changeRequest.commitChanges { (error) in
            guard error == nil else {
                return
            }
            print("School Name Saved!")
        }
        DispatchQueue.main.asyncAfter(deadline: .now()+1) {
            self.performSegue(withIdentifier: Constants.Segues.fromSchoolSignUpToSchoolDashboard, sender: self)
        }
    }
}

这是“学校”用户的注册功能,但“学生”用户本质上是相同的,只是不同的字段,当然还有不同的 segue 目的地。现在可能就像一天前或两天前,我正在测试这个功能,它工作得很好,用户成功注册,用户信息被写入 firestore,显示正确的视图控制器,唯一的区别是我有一些DispatchGroup函数中的块,因为当我在 TestFlight 中运行该方法时,会有几个错误会导致应用程序崩溃。

所以我想既然模拟器中的一切都运行良好,我将构建存档,将其上传到 TestFlight 并等待它被批准。它昨晚获得批准,今天早上我最终在手机上对其进行了测试以再次查看它,现在当我尝试以学校用户或学生用户身份注册时,它每次都转到错误的视图控制器并且没有信息被写入firestore,用户只是保存在Firebase Auth中,这不是我在我的应用程序中期望的结果。

我检查了 segue 标识符,检查了连接选项卡,即使 24 小时前它运行良好,我仍然检查了所有内容。我正在尽我最大的努力真正欣赏 Apple 为开发人员所做的事情,但我真的开始对 TestFlight 产生仇恨,我在模拟器中所做和运行的一切都在 Xcode 上运行得非常好,只要我在 TestFlight 中运行它,一切只是走出窗外。我讨厌这些类型的错误,因为您真的不知道问题出在哪里,仅仅是因为您在以前的所有其他情况下都使用了完全相同的方法,如果不是非常相似的话。

登录过程适用于学生和学校用户,我将展示一个学校用户登录方法的示例:

@IBAction func loginPressed(_ sender: UIButton) {
    
   let validationError = validateFields()
    
    let email = schoolEmailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let password = schoolPasswordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    
    if validationError != nil {
        return
    } else {

        Auth.auth().signIn(withEmail: email, password: password) { (result, error) in
            guard let signInError = error?.localizedDescription else { return }
            let group = DispatchGroup()
            group.enter()
            guard error == nil else {
                self.showAlert(title: "Error Signing In", message: "There was an issue trying to sign the user in. \(signInError)")
                return
            }
            group.leave()
            
            group.notify(queue: .main) {
                DispatchQueue.main.asyncAfter(deadline: .now()+1) {
                    self.performSegue(withIdentifier: Constants.Segues.fromSchoolLoginToSchoolEvents, sender: self)
                }
            }
        }
    }
}

对于学生用户来说几乎相同。如果有人能在第一个代码片段中指出这个错误的可能问题,那就太棒了。提前致谢。

标签: iosswiftfirebasegoogle-cloud-firestorefirebase-authentication

解决方案


尽管它很有帮助,但删除error.localizedDescription线路使一切恢复正常。


推荐阅读