4

私はfirebaseデータベースにユーザーを保存しようとしています。私はFBSDKLoginManager()を使用してアカウント/ログインを作成しています。アカウントを作成すると、そのユーザーをfirebaseデータベースに保存します。私は現在、ユーザーをログインさせることができ、その電子メールはfirebaseの認証タブ(スクリーンショット参照)に表示されますが、updateChildValuesは影響を受けていないようです(スクリーンショットも参照)。Swift/Firebase:アカウントを作成するときに、FacebookユーザーをFirebaseデータベースに適切に保存するにはどうすればいいですか?

updateChildValuesを適切な場所に配置していますか?現在、signInWithCredentialの場所です。私はFBSDKGraphRequestを実行して、私がfirebaseデータベースに保存するのに興味がある情報を入手する必要があります。

私firebaseの認証]タブは、認証が機能している示しています enter image description here

しかし、データベースが更新されていない: enter image description here

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データで更新されました...なぜそれが長くかかるのかはっきりしません。ここではスクリーンショットです:

enter image description here

答えて

3

完了ブロック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") 
         }) 
        } 
       }) 


      } 
     } 
    }) 
} 
+1

作品!助けてくれてありがとう –

+0

聞いてよかった!!! – user2884707bond

4

スウィフト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") 
          }) 
         } 
        }) 


       } 
      } 
     }) 
    } 
+0

ようこそStackOverflowへ。元の質問者の質問に答えるだけでなく、このスレッドを最終的に見る他の人にも答えてください。あなたが何を変えたのか、それがなぜ機能するのか教えてください。 –

関連する問題