首页 > 解决方案 > Firebase - 关闭内的用户和 currentUser nil

问题描述

我在使用 Firebase 时遇到问题,我尝试获取uid变量Auth.auth().currentUser?.uid似乎返回 nil。

我在函数周围放置了各种打印语句(我在下面发布了完整的函数)以查看它们是否被调用 - 如果我在 中放置打印语句if let user = user,它不会被调用。如果我注释掉if let user = user(及其右括号),打印语句被成功调用,所以我猜user是零。

现在,如果我将 print 放在 之后guard let uid = Auth.auth().currentUser?.uid else {return}, print 语句又不会被调用,导致我相信它uid是 nil 并且保护语句正在返回。

我不知道为什么userAuth.auth().currentUser?.uid这里都是零。如何更改它以成功获取我的uid变量?

这是提供一些上下文的完整功能:

@IBAction func emailSignupNextPressed(_ sender: Any) {
    // Make sure text fields aren't empty
    guard nameField.text != "", emailField.text != "", passwordField.text != "", confirmPasswordField.text != "" else {return}

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

            if let error = error {
                print(error.localizedDescription)
            }

            if let user = user {

                guard let uid = Auth.auth().currentUser?.uid else {return}

                // Use name as Firebase display name for readability
                let changeRequest = Auth.auth().currentUser!.createProfileChangeRequest()
                changeRequest.displayName = self.nameField.text!
                changeRequest.commitChanges(completion: nil)

                // Create child node from userStorage "users". Profile image set to user's unique ID
                let imageRef = self.userStorage.child("\(uid).jpg")
                let data = UIImageJPEGRepresentation(self.selectProfileImageView.image!, 0.5)

                // Upload image to Firebase
                let uploadTask = imageRef.putData(data!, metadata: nil, completion: { (metadata, err) in
                    if err != nil {
                                                    print(err!.localizedDescription)
                    }
                    imageRef.downloadURL(completion: { (url, er) in
                        if er != nil {
                                                            print(er?.localizedDescription as Any)
                        }
                        if let url = url {


                            emailUserPicString = url.absoluteString
                            print("\n\n\npic:\(emailUserPicString)\n\n\n")

                            if emailUserPicString == "" {

                                let alertController = UIAlertController(title: "Profile Picture Error", message: "Don't forget to choose a profile picture!", preferredStyle: UIAlertControllerStyle.alert)

                                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {(alert :UIAlertAction!) in
                                })
                                alertController.addAction(okAction)

                                self.present(alertController, animated: true, completion: nil)

                                return

                            } else {
                                self.performSegue(withIdentifier: "emailToSetup", sender: nil)
                            }





                        }
                    })
                })
                uploadTask.resume()
            }
        })
    } else {
        print("Passwords don't match")
        passwordAlert()
    }
}

标签: iosswiftfirebase

解决方案


auth().currentUseruser仅当用户登录时才会返回。

您刚刚创建了此用户,因此尚未登录。

您通常可以uiduser传入的块中获取,例如:

let uid = user.uid

如果user为 null,则帐户创建失败,您应该检查错误。我注意到你正在使用

print(error.localizedDescription)

但您可能想使用:

print(error)

如果错误没有本地化描述。

通常,错误要么意味着网络问题,要么意味着用户已经拥有一个帐户。


顺便说一句,如果你想登录用户,你可以使用

Auth.auth().signIn(withEmail: email, password: password) { … }

推荐阅读