ios - 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 并且保护语句正在返回。
我不知道为什么user
,Auth.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()
}
}
解决方案
auth().currentUser
user
仅当用户登录时才会返回。
您刚刚创建了此用户,因此尚未登录。
您通常可以uid
从user
传入的块中获取,例如:
let uid = user.uid
如果user
为 null,则帐户创建失败,您应该检查错误。我注意到你正在使用
print(error.localizedDescription)
但您可能想使用:
print(error)
如果错误没有本地化描述。
通常,错误要么意味着网络问题,要么意味着用户已经拥有一个帐户。
顺便说一句,如果你想登录用户,你可以使用
Auth.auth().signIn(withEmail: email, password: password) { … }
推荐阅读
- git - ChefSpec 找不到安装的 git
- python - 我什么时候应该在 pandas 数据帧上使用 query vs eval?
- c - 将 printf 命令写入或保存到文本文件(c 编程)
- node.js - 同一行 Node.js 代码可以同时运行吗?
- java - java - 如何在java中使用useDelmeter从字符串中获取两个特定值?
- spring-boot-actuator - 如何自定义 Spring Boot admin 2.o UI?
- c - 从 16 位架构中的给定索引计算位掩码
- r - 有条件的按组计数(在 R data.table 中)
- angular - 活动路由解析器在每次调用时返回未定义
- vba - VBA/Word:将表单名称作为参数传递有效但会导致错误