2015-07-09 3 views
32

TL, TR: Как получить адрес электронной почты и имя пользователя, вошедшего в на мое приложение с помощью facebook SDK 4.4Получить адрес электронной почты и имя Facebook SDK v4.4.0 Swift

До сих пор я сумел войдите в систему, теперь я могу получить токен доступа из любого места приложения.

Как я мой взгляд Войти контроллер и facebook Войти Кнопка конфигурации:

class LoginViewController: UIViewController, FBSDKLoginButtonDelegate { 

    @IBOutlet weak var loginButton: FBSDKLoginButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if(FBSDKAccessToken.currentAccessToken() == nil) 
     { 
      print("not logged in") 
     } 
     else{ 
      print("logged in already") 
     } 

     loginButton.readPermissions = ["public_profile","email"] 
     loginButton.delegate = self 

    } 

    //MARK -FB login 
    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     //logged in 
     if(error == nil) 
     { 
      print("login complete") 
      print(result.grantedPermissions) 
     } 
     else{ 
      print(error.localizedDescription) 
     } 

    } 

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { 
     //logout 
     print("logout") 
    } 

Теперь на моем главном экране можно получить маркер доступа, как так:

let accessToken = FBSDKAccessToken.currentAccessToken() 
    if(accessToken != nil) //should be != nil 
    { 
     print(accessToken.tokenString) 
    } 

Как получить имя и адрес электронной почты от пользователя, который вошел в систему, я вижу много вопросов и ответов, используя старый SDK или используя Objective-C.

ответ

46

В андроиде я использовал fields, поэтому я решил попробовать его в IOS, и он работает.

 let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: accessToken.tokenString, version: nil, HTTPMethod: "GET") 
     req.startWithCompletionHandler({ (connection, result, error : NSError!) -> Void in 
      if(error == nil) 
      { 
       print("result \(result)") 
      } 
      else 
      { 
       print("error \(error)") 
      } 
     }) 

результат печати:

result{ 
    email = "[email protected]"; 
    id = 123456789; 
    name = "Your Name"; 
} 

Найдено, что эти поля равны User конечной точки, см this link, где вы можете увидеть все поля, которые вы можете получить.

+2

Я забирал волосы за последние 3 часа, чтобы получить электронная почта. Им действительно нужно обновить свои документы с этими нарушающими изменениями. Слава богу, я нашел это. – Isuru

+0

@RageCompex, это тоже заставка для меня. Большое спасибо. Возможно ли получить номер телефона, пожалуйста? –

+0

см. Обновленный ответ @ Tristan.Liu, номер телефона нет в списке, но, вероятно, он находится где-то еще после того, как у вас есть идентификатор. Я думаю, вам также нужно спросить это разрешение. – CularBytes

1

В Swift вы можете сделать запрос Графа (как показано на примере @RageCompex) из обратного вызова didCompleteWithResult для входа в систему.

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) 
    { 
     print(result.token.tokenString) //YOUR FB TOKEN 
     let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: result.token.tokenString, version: nil, HTTPMethod: "GET") 
     req.startWithCompletionHandler({ (connection, result, error : NSError!) -> Void in 
      if(error == nil) 
      { 
       print("result \(result)") 
      } 
      else 
      { 
       print("error \(error)") 
      } 
     }) 
} 
15

Для Swift 3 & Facebook SDK 4.16.0:

func getFBUserInfo() { 
    let request = GraphRequest(graphPath: "me", parameters: ["fields":"email,name"], accessToken: AccessToken.current, httpMethod: .GET, apiVersion: FacebookCore.GraphAPIVersion.defaultVersion) 
    request.start { (response, result) in 
     switch result { 
     case .success(let value): 
      print(value.dictionaryValue) 
     case .failed(let error): 
      print(error) 
     } 
    } 
} 

и будет печатать:

Optional(["id": 1xxxxxxxxxxxxx, "name": Me, "email": [email protected]]) 
+1

не работает больше Swift 3 –

19

Для Swift 3.0

let graphRequest:FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"first_name,email, picture.type(large)"]) 

       graphRequest.start(completionHandler: { (connection, result, error) -> Void in 

        if ((error) != nil) 
        { 
         print("Error: \(error)") 
        } 
        else 
        { 
         let data:[String:AnyObject] = result as! [String : AnyObject] 
         print(data) 

        } 
       }) 
+0

Не удалось передать значение типа '__NSCFDictionary' (0x195fd38a8) в 'NSData' (0x195fd2750). –

+0

@RayKing, проверьте обновленный ответ, пожалуйста. –

+1

он не вернул электронное письмо, я уже пробовал это –

4

facebook ИОС SDK получить имя пользователя и адрес электронной стрижа 3

FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email"]).start(completionHandler: { (connection, result, error) -> Void in 
     if (error == nil){ 
      let fbDetails = result as! NSDictionary 
      print(fbDetails) 
     }else{ 
      print(error?.localizedDescription ?? "Not found") 
     } 
    }) 
+0

, это может; t вернуть поле электронной почты, я уже пробовал это –

1

Рамки, кажется, обновляется и путь, который работал для меня это:

import FacebookCore 

let graphRequest: GraphRequest = GraphRequest(graphPath: "me", parameters: ["fields":"first_name,email, picture.type(large)"], accessToken: accessToken, httpMethod: .GET) 
      graphRequest.start({ (response, result) in 
       switch result { 
       case .failed(let error): 
        print(error) 
       case .success(let result): 
        if let data = result as? [String : AnyObject] { 
         print(data) 
        } 


       } 
      }) 
0

вы можете использовать этот код, чтобы получить электронное письмо, имя и профайл пользователя

@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,picture.type(large)"]).start(completionHandler: { (connection, result, error) in 
    guard let Info = result as? [String: Any] else { return } 

      if let imageURL = ((Info["picture"] as? [String: Any])?["data"] as? [String: Any])?["url"] as? String { 
     //Download image from imageURL 
    } 
if(error == nil){ 
print("result") 
} 
}) 
} 
} 
Смежные вопросы