Swift iOS Firebase-如果FirebaseAuth.FIRUser对象不是';t nil如何可能使其上的.email返回nil?
我使用Firebase的电子邮件/密码登录方法为用户创建帐户。使用该方法,用户必须拥有电子邮件地址才能通过Firebase的身份验证 FirebaseAuth有一个名为Swift iOS Firebase-如果FirebaseAuth.FIRUser对象不是';t nil如何可能使其上的.email返回nil?,ios,swift,firebase,firebase-authentication,Ios,Swift,Firebase,Firebase Authentication,我使用Firebase的电子邮件/密码登录方法为用户创建帐户。使用该方法,用户必须拥有电子邮件地址才能通过Firebase的身份验证 FirebaseAuth有一个名为User 当用户首次在回调中创建帐户或登录到现有帐户时,user对象将被初始化: 创建帐户: Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (
User
当用户首次在回调中创建帐户或登录到现有帐户时,user
对象将被初始化:
创建帐户:
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
(user, error) in
// user's auth credentials are now created but user can still be nil
登录到现有帐户:
Auth.auth().signIn(withEmail: self.emailTextField.text!, password: self.passwordTextField.text!, completion: {
(user, error) in
// user's auth credentials are now accessed but user can still be nil
Auth.auth().signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
(user, error) in
if error != nil { return }
if let user = user{
let sharedInstance = FirebaseSingleton.sharedInstance
sharedInstance.currentUser = user
sharedInstance.currentUserID = user.uid
sharedInstance.currentUserEmail = user.email // at this point is it possible for this to be nil?
sharedInstance.currentUserPhotoUrl = user.photoURL
sharedInstance.currentUserDisplayName = user.displayName
}else{
return
}
// is this guard statements necessary?
guard let email = user.uid else { return }
})
User
对象上有一个.email
可选的字符串类型,其中包含用户的电子邮件地址
我使用singleton类来管理通过Firebase发生的一切,在上述两种情况下,当用户
对象初始化时,我将数据传递给我的Firebase singleton类属性。我知道用户对象可以返回为nil,所以我运行了一个if let
,以确保它不是
我的问题是,如果用户
对象在回调中不为零,是否使用电子邮件/密码登录方法,.Email
是否可能为零,即使需要它来创建帐户或登录?
运行if let
语句后,我使用guard
语句检查.email
是否为零,但它似乎可以在FirebaseSingleton属性初始化之前运行(这意味着它将为零)或者,如果用户对象保证返回一个值,那么它可能是不必要的
顺便说一句,无论用户是创建帐户还是登录EmailTextField和passwordTextField,在这两种情况下都不会为零。我运行空白、.isEmpty和!=没有检查他们
我的代码:
class FirebaseSingleton{
static let sharedInstance = FirebaseSingleton()
var dbRef: DatabaseReference? = Database.database().reference()
var storageDbRef: StorageReference? = Storage.storage().reference(forURL: "gs://blablabla.appspot.com")
var currentUser: User? = Auth.auth().currentUser
var currentUserID: String? = Auth.auth().currentUser?.uid
var currentUserEmail: String? = Auth.auth().currentUser?.email
var currentUserPhotoUrl: URL? = Auth.auth().currentUser?.photoURL
var currentUserDisplayName: String? = Auth.auth().currentUser?.displayName
}
创建帐户:
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
(user, error) in
if error != nil { return }
if let user = user{
let sharedInstance = FirebaseSingleton.sharedInstance
sharedInstance.currentUser = user
sharedInstance.currentUserID = user.uid
sharedInstance.currentUserEmail = user.email // at this point is it possible for this to be nil?
sharedInstance.currentUserPhotoUrl = user.photoURL
sharedInstance.currentUserDisplayName = user.displayName
}else{
return
}
// is this guard statement necessary?
guard let email = user.uid else { return }
})
登录到现有帐户:
Auth.auth().signIn(withEmail: self.emailTextField.text!, password: self.passwordTextField.text!, completion: {
(user, error) in
// user's auth credentials are now accessed but user can still be nil
Auth.auth().signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
(user, error) in
if error != nil { return }
if let user = user{
let sharedInstance = FirebaseSingleton.sharedInstance
sharedInstance.currentUser = user
sharedInstance.currentUserID = user.uid
sharedInstance.currentUserEmail = user.email // at this point is it possible for this to be nil?
sharedInstance.currentUserPhotoUrl = user.photoURL
sharedInstance.currentUserDisplayName = user.displayName
}else{
return
}
// is this guard statements necessary?
guard let email = user.uid else { return }
})
不确定您到底想问什么(因为在我看来,user.uid更像是一个快速的问题,而不是firebase问题),但只要用户不是nil,
uid
属性不是可选的(String
),因此user.uid将永远不会是nil。这与电子邮件不同,电子邮件是一个字符串?
,因此可能是或不是零在与@Benjamin Jimenez和per@kbunarjo建议召开会议后,我做了一些思考,意识到Firebase也有一个电话登录方法。如果它被启用,并且用户选择它作为他们的登录方法,那么.email
地址将为零,因为没有用于创建帐户的电子邮件地址
对于我的情况,由于我使用的是电子邮件/密码登录方法,.Email
不应为零,因为这是创建帐户的唯一方法。但正如用户可以在完成处理程序中返回为nil一样(即使使用正确的电子邮件和密码),可能电子邮件地址也可以返回为nil,因为它是可选的
也就是说,如果让我们检查user.email
是否为零,并且出于某种奇怪的原因,它是否为零,那么使用另一种最安全的方法是使用输入emailTextField的电子邮件地址作为替代。在emailTextField和password组合中输入的电子邮件地址必须正确,否则用户将无法通过Firebase的身份验证,出现错误!=零
Auth.auth().signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: {
(user, error) in
// if the email address and/or password are incorrect then error != nil and the code below this wont run
if error != nil { return }
if let user = user{
let sharedInstance = FirebaseSingleton.sharedInstance
sharedInstance.currentUser = user
sharedInstance.currentUserID = user.uid
sharedInstance.currentUserPhotoUrl = user.photoURL
sharedInstance.currentUserDisplayName = user.displayName
// instead of the guard statement I use another ‘if-let’ if for some reason .email is nil
if let currentUserEmail = user.email {
sharedInstance.currentUserEmail = currentUserEmail
}else{
sharedInstance.currentUserEmail = self.emailTextField.text! // the email address entered into here has to be valid otherwise it would've never made it to this point
}
}else{
return
}
})
如果创建帐户,则对回调使用相同的代码
正如@rMickeyD所指出的,Facebook登录方法也不会使用电子邮件地址。我从未使用过它,所以我没有包括它。基本上,如果没有其他登录方法不使用您的电子邮件地址,则user.email将为零。即使我有匿名登录选项,使用匿名登录的方法也不需要电子邮件地址或密码,因此可以理解电子邮件将为零
您应该检查文档,看看他们是否需要所有其他登录方法的电子邮件,但电话号码不需要它。只要您在创建用户时检查用户名和密码文本字段都是非空字符串,.uid和.email不应为零。@kbunarjo嘿,谢谢。我会更新我的问题来转换,但是是的,我100%确定这些字段不会是nilIs Email/Password您唯一的登录方法?特别是您是否启用了匿名用户?然后你可能会有一个尚未登录的用户,其电子邮件为零。当我询问的值是从Firebase返回的值时,这怎么不是Firebase的问题?User.uid和User.email来自FirebaseAuthyes,但您要问的是这些变量是否可以为零<代码>字符串
对象不能为零,swift不允许为零,否则应用程序将崩溃<代码>字符串?
对象可以为零,这是Swift中optionals的用途,无论它是Firebase类还是您自己的项目类检查您关于optionals的说法是否正确字符串不能为零,类型是否为可选字符串?可以为零,但我的问题不是关于字符串或可选的字符串类型?我的问题是FirebaseAuth.User.email或uid是否可以为零。好吧,好吧,uid不能为零,我承认我忽略了这一点,但是。电子邮件我想知道的是,如果用户对象不是零,但它有一个电子邮件地址,这是创建帐户所必需的(使用电子邮件)。电子邮件怎么可能为零呢?好吧,现在我们讨论的是Firebase,因为User.email
是可选的,我会依赖于那些你确信不是零的东西,user.uid
和emailTextField.text
。该电子邮件不应与user.email中的电子邮件不同,否则登录将无法进行work@Jake我忘记了电话登录方法。谢谢:)另外,Facebook登录并不总是有与之关联的电子邮件。@rMickeyD