2015-07-14 10 views
12

Próbuję uzyskać informacje przez sdk na Facebooku, ale jak na razie otrzymuję tylko identyfikator i nazwę użytkownika, chociaż jestem pewien, że jest dostępny e-mail, ponieważ jest to moje konto. Szukałem tutaj kilku odpowiedzi, ale żaden z nich nie rozwiązał dotychczas mojego problemu. Co robię źle, i dlaczego nie zwraca więcej danych, ponieważ żądam kilku uprawnień?IOS Facebook SDK: login nie zwraca wiadomości e-mail pomimo przyznanych uprawnień

Oto mój kod:

fbLoginManager.logInWithReadPermissions(["public_profile", "email", "user_friends", "user_about_me", "user_birthday"], handler: { (result, error) -> Void in 
     if ((error) != nil) 
     { 
      // Process error 
      println("There were an error: \(error)") 
     } 
     else if result.isCancelled { 
      // Handle cancellations 
      fbLoginManager.logOut() 
     } 
     else { 
      var fbloginresult : FBSDKLoginManagerLoginResult = result 
      if(fbloginresult.grantedPermissions.contains("email")) 
      { 
       println(fbloginresult) 
       self.returnUserData() 
      } 
     } 
    }) 

i funkcji, aby uzyskać dane użytkownika:

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("fetched user: \(result)") 

      if let userName : NSString = result.valueForKey("name") as? NSString { 
       println("User Name is: \(userName)") 
      } 
      if let userEmail : NSString = result.valueForKey("email") as? NSString { 
       println("User Email is: \(userEmail)") 
      } 
     } 
    }) 
} 

która zwraca:

fetched user: { 
id = 55555555; 
name = "Kali Aney"; 
} 
User Name is: Kali Aney 

Odpowiedz

37

Interfejs API wykresu Facebook złamał jego zgodność wsteczną (gdy jest używany w sposób domyślny) Od wersji Graph-API 2.4 (Pod wersja 4.4.0).

FB Graph-API 2.4 nie zwraca wszystkich pól domyślnych dla użytkownika

W tym celu można użyć explicite wykres wersji 2.3 rozwiązania:

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil tokenString:[FBSDKAccessToken currentAccessToken].tokenString version:@"v2.3" HTTPMethod:nil]

w takim przypadku FB zapewnia v2 .3 będzie dostępny za co najmniej 2 lata od teraz. https://developers.facebook.com/docs/graph-api/overview:

Graph API ma kilka wersji dostępnych na dostęp w dowolnym czasie. Każda wersja zawiera zestaw pól podstawowych i operacji krawędziowych. Udzielamy gwarancji, że te podstawowe interfejsy API będą dostępne i niezmodyfikowane w tej wersji przez co najmniej 2 lata od wydania. Dziennik zmian na platformie informuje, które wersje są obecnie dostępne w wersji .

LUB

można użyć nowego Graph-API (v2.4) w prosząc o konkretnych dziedzinach jesteś zainteresowany:

[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields" : @"email,name"}]

+0

z Graph-API 2.4, jak zalogować się na urodziny użytkownika lub co przekazać w @ "polach" na urodziny? –

+0

Wielka niespodzianka od FB i @HeTzi dzięki za odpowiedź –

+0

Już tam. Podawanie dla aplikacji, ale dla przeglądarki. To nie jest powracająca wiadomość e-mail. – Saad

0

Nigdy nie pracowałem z IOS, ale Mam duże doświadczenie z Facebookiem. Moja pierwsza uwaga jest taka, że ​​za każdym razem, gdy poprosisz o pozwolenie na Facebooku, musisz upewnić się, że: - dajesz swoim użytkownikom znać, dlaczego potrzebujesz tego pozwolenia - respektujesz warunki Facebooka - na pewno będziesz potrzebować tego pozwolenia w niedalekiej przyszłości

Ta lista

["public_profile", "email", "user_friends", "user_about_me", "user_birthday"] 

wydaje się być niejasne. Musisz upewnić się, że prosisz o minimalny zestaw uprawnień, których na pewno będziesz potrzebować w najbliższej przyszłości.

Co do samego żądania, upewnij się, że używasz poprawnej sesji na Facebooku. I zrobić to w ten sposób w PHP:

 $request = new \Facebook\FacebookRequest(self::$session, 'GET', '/me'); 
     $response = $request->execute(); 
     // get response 
     $graphObject = $response->getGraphObject()->asArray(); 

jestem pewien, trzeba mieć coś podobnego getGraphObject w SDK, jak również.

+0

dziękuję za odpowiedź, ale nie jestem pewien, jak go używać dla iOS. .. Żądam pozwolenia na e-mail, więc ten powinien być w powrocie. –

7

zmagałem się z tym problemem prawie przez cały dzień, aż do znalezienia odpowiedzi przez @HeTzi, która działała idealnie. Szybka wersja takiego żądania to:

func referenceFBData() { 
    var request = FBSDKGraphRequest(graphPath:"me", parameters: ["fields":"email,first_name,gender"]); 

    request.startWithCompletionHandler { (connection : FBSDKGraphRequestConnection!, result : AnyObject!, error : NSError!) -> Void in 
     if error == nil { 
      println("The information requested is : \(result)") 
     } else { 
      println("Error getting information \(error)"); 
     } 
    } 
} 

Pamiętaj, że najpierw musisz zażądać odpowiednich uprawnień do odczytu, aby uzyskać dane za pomocą tego żądania.

+1

Ten gość @HetZi jest naprawdę dobry ... – gmaliar

5

w moim przypadku wiadomości e-mail nie został zweryfikowany przez użytkowników ów dlaczego nie coraz to nawet po przyznaniu uprawnień;)

+0

ten sam problem był tutaj ... dzięki bro;) –

+0

przegłosuj odpowiedź, jeśli pomogła ci –

+0

Skąd się dowiedziałeś, że to jest problem, ponieważ Fb nie rzuca takie błędy? –

5

to działa ... nadzieję, że to pomaga ..

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
    [parameters setValue:@"id, name, email" forKey:@"fields"]; 

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{ 
     NSLog(@"Fetched user is:%@", result); 
}]; 
1

Funkcja w Swift tak:

func fbsignup() { 
     let lgManager = FBSDKLoginManager() 
     lgManager.logInWithReadPermissions(["public_profile","email"], fromViewController: self,handler: { (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in 
      if error != nil{ 
       print("facebook error") 
      }else if result.isCancelled { 
       print("Canceled") 
      }else{ 
       if result.grantedPermissions.contains("email") { 
        if (FBSDKAccessToken.currentAccessToken() != nil) { 
         FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"]) .startWithCompletionHandler({ (connection:FBSDKGraphRequestConnection!, result:AnyObject!, error:NSError!) -> Void in 
          print(result) 
         }) 
        } 
       } 
      } 
     }) 
    } 
1

Testowane Swift 2.2

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     print("User Logged In") 
if ((error) != nil) 
     { 
      // Process error 
     } 
     else if result.isCancelled { 
      // Handle cancellations 
     } 
     else { 
      // If you ask for multiple permissions at once, you 
      // should check if specific permissions missing 
      if result.grantedPermissions.contains("email") 
      { 
       // Do work 
       getUserData() 
      } 
     }} 

func getUserData() 
{ 
    if ((FBSDKAccessToken.currentAccessToken()) != nil) 
    { 
     let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, name"]) 
     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 userEmail : NSString = result.valueForKey("email") as! NSString 
       print("User Email is: \(userEmail)") 

      } 
     }) 
    } 
} 
0

Za pomocą tych funkcji to będzie działać na pewno

@IBAction func fbsignup(_ sender: Any) { 
     let fbloginManger: FBSDKLoginManager = FBSDKLoginManager() 
     fbloginManger.logIn(withReadPermissions: ["email"], from:self) { (result, error) -> Void in 
      if(error == nil){ 
       let fbLoginResult: FBSDKLoginManagerLoginResult = result! 

       if(result?.isCancelled)!{ 
        return } 


       if(fbLoginResult .grantedPermissions.contains("email")){ 
        self.getFbId() 
       } 
      } } 

    } 
    func getFbId(){ 
    if(FBSDKAccessToken.current() != nil){ 
    FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id,name , first_name, last_name , email"]).start(completionHandler: { (connection, result, error) in 
    if(error == nil){ 
    print("result") 
    } 
    }) 
    } 
    } 

i podłączyć fbsignup(_sender: Any)funkcję z przycisku

Powiązane problemy