【问题标题】:Swift / Firebase: How do I properly store a Facebook user into Firebase database when they create an account?Swift / Firebase:创建帐户时如何将 Facebook 用户正确存储到 Firebase 数据库中?
【发布时间】:2016-09-10 21:38:23
【问题描述】:

我正在尝试将用户保存到我的 firebase 数据库。我使用FBSDKLoginManager() 创建帐户/登录。创建帐户后,我想将用户存储到我的firebase 数据库中。我目前可以让用户登录,他们的电子邮件会显示在 firebase 的 Auth 选项卡中(见截图),但我的 updateChildValues 似乎没有任何影响(另见截图)。

我是否将updateChildValues 放置在正确的位置?它目前位于signInWithCredential 内。我还必须执行 FBSDKGraphRequest 来获取我有兴趣存储在我的 firebase 数据库中的信息。

我的 Firebase 的 Auth 选项卡显示身份验证正在工作:

但数据库没有更新:

    func showLoginView() {
    let loginManager = FBSDKLoginManager()
    loginManager.logInWithReadPermissions(fbPermissions, fromViewController: self, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in

        if ((error) != nil) {
            print("Error loggin in is \(error)")
        } else if (result.isCancelled) {
            print("The user cancelled loggin in")
        } else {
            // No error, No cancelling:
            // using the FBAccessToken, we get a Firebase token
            let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)

            // using the credentials above, sign in to firebase to create a user session
            FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
                print("User logged in the firebase")

                // adding a reference to our firebase database
                let ref = FIRDatabase.database().referenceFromURL("https://project-12345.firebaseio.com/")

                // guard for user id
                guard let uid = user?.uid else {
                    return
                }

                // create a child reference - uid will let us wrap each users data in a unique user id for later reference
                let usersReference = ref.child("users").child(uid)

                // performing the Facebook graph request to get the user data that just logged in so we can assign this stuff to our Firebase database:
                let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, email"])
                graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in

                    if ((error) != nil) {
                        // Process error
                        print("Error: \(error)")
                    } else {
                        print("fetched user: \(result)")

                        // Facebook users name:
                        let userName:NSString = result.valueForKey("name") as! NSString
                        self.usersName = userName
                        print("User Name is: \(userName)")
                        print("self.usersName is \(self.usersName)")

                        // Facebook users email:
                        let userEmail:NSString = result.valueForKey("email") as! NSString
                        self.usersEmail = userEmail
                        print("User Email is: \(userEmail)")
                        print("self.usersEmail is \(self.usersEmail)")

                        // Facebook users ID:
                        let userID:NSString = result.valueForKey("id") as! NSString
                        self.usersFacebookID = userID
                        print("Users Facebook ID is: \(userID)")
                        print("self.usersFacebookID is \(self.usersFacebookID)")
                    }
                })

                // set values for assignment in our Firebase database
                let values = ["name": self.usersName, "email": self.usersEmail, "facebookID": self.usersFacebookID]

                // update our databse by using the child database reference above called usersReference
                usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                    // if there's an error in saving to our firebase database
                    if err != nil {
                        print(err)
                        return
                    }
                    // no error, so it means we've saved the user into our firebase database successfully
                    print("Save the user successfully into Firebase database")
                })
            }
        }
    })
}

更新:

显然在 10 分钟左右后,数据库已更新为空的 Facebook 数据……不知道为什么要花这么长时间。截图如下:

【问题讨论】:

    标签: swift firebase firebase-realtime-database facebook-login firebase-authentication


    【解决方案1】:

    Swift 3:(只在最后改了,省了很多行)

     func showLoginView() {
            let loginManager = FBSDKLoginManager()
            loginManager.logInWithReadPermissions(fbPermissions, fromViewController: self, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
    
                if ((error) != nil) {
                    print("Error loggin in is \(error)")
                } else if (result.isCancelled) {
                    print("The user cancelled loggin in")
                } else {
                    // No error, No cancelling:
                    // using the FBAccessToken, we get a Firebase token
                    let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
    
                    // using the credentials above, sign in to firebase to create a user session
                    FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
                        print("User logged in the firebase")
    
                        // adding a reference to our firebase database
                        let ref = FIRDatabase.database().referenceFromURL("https://project-12345.firebaseio.com/")
    
                        // guard for user id
                        guard let uid = user?.uid else {
                            return
                        }
    
                        // create a child reference - uid will let us wrap each users data in a unique user id for later reference
                        let usersReference = ref.child("users").child(uid)
    
                        // performing the Facebook graph request to get the user data that just logged in so we can assign this stuff to our Firebase database:
                        let graphRequest : FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, email, name"]).start{
                            (connection, result, err) in
    
                            if ((error) != nil) {
                                // Process error
                                print("Error: \(error)")
                            } else {
                                print("fetched user: \(result)")
    
                                let values: [String:AnyObject] = result as! [String : AnyObject]
    
                                // update our databse by using the child database reference above called usersReference
                                usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                                    // if there's an error in saving to our firebase database
                                    if err != nil {
                                        print(err)
                                        return
                                    }
                                    // no error, so it means we've saved the user into our firebase database successfully
                                    print("Save the user successfully into Firebase database")
                                })
                            }
                        })
    
    
                    }
                }
            })
        }
    

    【讨论】:

    • 欢迎来到 StackOverflow。您不仅要为最初的提问者回答问题,还应该尝试为最终也看到此线程的其他人回答问题。请告诉我们您所做的更改以及更改的原因。
    【解决方案2】:

    您应该只在执行完成块graphRequest.startWithCompletionHandler 时更新值,因为那时您将从 Facebook! 获取数据。 usersReference.updateChildValues 需要在完成块内 graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in。我已经附在下面了。试试看!!

    func showLoginView() {
        let loginManager = FBSDKLoginManager()
        loginManager.logInWithReadPermissions(fbPermissions, fromViewController: self, handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
    
            if ((error) != nil) {
                print("Error loggin in is \(error)")
            } else if (result.isCancelled) {
                print("The user cancelled loggin in")
            } else {
                // No error, No cancelling:
                // using the FBAccessToken, we get a Firebase token
                let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
    
                // using the credentials above, sign in to firebase to create a user session
                FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
                    print("User logged in the firebase")
    
                    // adding a reference to our firebase database
                    let ref = FIRDatabase.database().referenceFromURL("https://project-12345.firebaseio.com/")
    
                    // guard for user id
                    guard let uid = user?.uid else {
                        return
                    }
    
                    // create a child reference - uid will let us wrap each users data in a unique user id for later reference
                    let usersReference = ref.child("users").child(uid)
    
                    // performing the Facebook graph request to get the user data that just logged in so we can assign this stuff to our Firebase database:
                    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, email"])
                    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
    
                        if ((error) != nil) {
                            // Process error
                            print("Error: \(error)")
                        } else {
                            print("fetched user: \(result)")
    
                            // Facebook users name:
                            let userName:NSString = result.valueForKey("name") as! NSString
                            self.usersName = userName
                            print("User Name is: \(userName)")
                            print("self.usersName is \(self.usersName)")
    
                            // Facebook users email:
                            let userEmail:NSString = result.valueForKey("email") as! NSString
                            self.usersEmail = userEmail
                            print("User Email is: \(userEmail)")
                            print("self.usersEmail is \(self.usersEmail)")
    
                            // Facebook users ID:
                            let userID:NSString = result.valueForKey("id") as! NSString
                            self.usersFacebookID = userID
                            print("Users Facebook ID is: \(userID)")
                            print("self.usersFacebookID is \(self.usersFacebookID)")
    
                            //graphRequest.startWithCompletionHandler may not come back during serial
                            //execution so you cannot assume that you will have date by the time it gets
                            //to the let values = ["name":
                            //By putting it inside here it makes sure to update the date once it is
                            //returned from the completionHandler
                            // set values for assignment in our Firebase database
                            let values = ["name": self.usersName, "email": self.usersEmail, "facebookID": self.usersFacebookID]
    
                            // update our databse by using the child database reference above called usersReference
                            usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                                // if there's an error in saving to our firebase database
                                if err != nil {
                                    print(err)
                                    return
                                }
                                // no error, so it means we've saved the user into our firebase database successfully
                                print("Save the user successfully into Firebase database")
                            })
                        }
                    })
    
    
                }
            }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 2017-12-04
      • 2017-03-09
      相关资源
      最近更新 更多