2015-07-13 1 views
11

Iam utilisant la dernière FBSDK (à l'aide rapide)iOS facebookSDK obtenir tous les détails de l'utilisateur

//MARK: sign in with facebook 
func signInWithFacebook() 
{ 
    if (FBSDKAccessToken.currentAccessToken() != nil) 
    { 
     // User is already logged in, do work such as go to next view controller. 
     println("already logged in ") 
     self.returnUserData() 

     return 
    } 
    var faceBookLoginManger = FBSDKLoginManager() 
    faceBookLoginManger.logInWithReadPermissions(["public_profile", "email", "user_friends"], handler: { (result, error)-> Void in 
     //result is FBSDKLoginManagerLoginResult 
     if (error != nil) 
     { 
      println("error is \(error)") 
     } 
     if (result.isCancelled) 
     { 
      //handle cancelations 
     } 
     if result.grantedPermissions.contains("email") 
     { 
      self.returnUserData() 
     } 
    }) 
} 

func returnUserData() 
{ 
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) 
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 

     if ((error) != nil) 
     { 
      // Process error 
      println("Error: \(error)") 
     } 
     else 
     { 
      println("the access token is \(FBSDKAccessToken.currentAccessToken().tokenString)") 

      var accessToken = FBSDKAccessToken.currentAccessToken().tokenString 

      var userID = result.valueForKey("id") as! NSString 
      var facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large" 



      println("fetched user: \(result)") 


} 

lorsque j'imprime l'utilisateur tiré par les cheveux que je ne reçois que l'identifiant et le nom! , mais j'ai demandé une permission pour le courrier électronique et les amis et le profil, quel est le problème ???

BTW: J'ai déplacé ce projet de mon macbook à un autre macbook (parce que j'ai formaté le mien) il a très bien fonctionné quand il était au macbook sur lequel j'ai créé le projet, mais après avoir déplacé le projet (using bitbucket clone) J'ai obtenu ce résultat.

+1

réf. s lien j'espère résoudre votre problème http://stackoverflow.com/a/30634444/4536708 @ user3703910 –

+0

** Problème résolu en double post: ** http://stackoverflow.com/a/31503463/3382676 – HeTzi

Répondre

33

Selon le nouveau SDK Facebook, vous devez avoir à passer les paramètres avec le FBSDKGraphRequest

if((FBSDKAccessToken.currentAccessToken()) != nil){ 
    FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).startWithCompletionHandler({ (connection, result, error) -> Void in 
     if (error == nil){ 
      println(result) 
     } 
    }) 
} 

Documentations Lien: https://developers.facebook.com/docs/facebook-login/permissions/v2.4

Référence de l'objet utilisateur: https://developers.facebook.com/docs/graph-api/reference/user

Avec profil public, vous pouvez obtenir le sexe:

public_profile (Default) 

Provides access to a subset of items that are part of a person's public profile. A person's public profile refers to the following properties on the user object by default: 

id 
name 
first_name 
last_name 
age_range 
link 
gender 
locale 
timezone 
updated_time 
verified 
+0

pourriez-vous diriger moi à leur documentation? , et comment puis-je obtenir le genre? – user3703910

+0

@ user3703910 a mis à jour la réponse (O) –

+0

comment obtenir la valeur du résultat? J'ai besoin d'obtenir l'adresse e-mail, prénom et nom de famille etc. comment faire cela? J'ai essayé avec result.valueForKey ("email"). ça ne m'a pas aidé. – Noorul

4

Je suppose que ce code devrait vous aider à obtenir les détails nécessaires

2.x Swift

let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) 
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 

     if ((error) != nil) 
     { 
      // Process error 
      print("Error: \(error)") 
     } 
     else 
     { 
      print("fetched user: \(result)") 
      let userName : NSString = result.valueForKey("name") as! NSString 
      print("User Name is: \(userName)") 
      let userID : NSString = result.valueForKey("id") as! NSString 
      print("User Email is: \(userID)") 



     } 
    }) 
+0

Obtention de la valeur de type 'Tout?' n'a pas de membre 'valueForKey' message d'erreur –

+0

La réponse ci-dessus est pour Swift 2.x, maintenant dans 3.x rapide l'essayer comme ça. (Je vais mettre à jour la réponse ci-dessus pour swift 3 aussi) laisser les données: [String: AnyObject] = result as as! [String: AnyObject] print (data ["first_name"]!) print (data ["id"]!) –

1

Swift 4

Un exemple à Swift 4 qui montre aussi comment analyser correctement les champs individuels du résultat:

func fetchFacebookFields() { 
    //do login with permissions for email and public profile 
    FBSDKLoginManager().logIn(withReadPermissions: ["email","public_profile"], from: nil) { 
     (result, error) -> Void in 
     //if we have an error display it and abort 
     if let error = error { 
      log.error(error.localizedDescription) 
      return 
     } 
     //make sure we have a result, otherwise abort 
     guard let result = result else { return } 
     //if cancelled nothing todo 
     if result.isCancelled { return } 
     else { 
      //login successfull, now request the fields we like to have in this case first name and last name 
      FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "first_name, last_name"]).start() { 
       (connection, result, error) in 
       //if we have an error display it and abort 
       if let error = error { 
        log.error(error.localizedDescription) 
        return 
       } 
       //parse the fields out of the result 
       if 
        let fields = result as? [String:Any], 
        let firstName = fields["first_name"] as? String, 
        let lastName = fields["last_name"] as? String 
       { 
        log.debug("firstName -> \(firstName)") 
        log.debug("lastName -> \(lastName)") 
       } 
      } 
     } 
    } 
} 
+0

bon exemple pour Swift 4, typo sur la 2ème à la dernière ligne si firsName -> firstName – shokaveli

+0

Thx for the feedback @shokaveli l'a corrigé :) – HixField