Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift iOS Firebase-如果FirebaseAuth.FIRUser对象不是';t nil如何可能使其上的.email返回nil?_Ios_Swift_Firebase_Firebase Authentication - Fatal编程技术网

Swift iOS Firebase-如果FirebaseAuth.FIRUser对象不是';t nil如何可能使其上的.email返回nil?

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: { (

我使用Firebase的电子邮件/密码登录方法为用户创建帐户。使用该方法,用户必须拥有电子邮件地址才能通过Firebase的身份验证

FirebaseAuth有一个名为
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