2017-06-14 42 views
1

我在这里看到类似的问题,但似乎没有解决我的问题。iOS Facebook SDK:FBSDKGraphRequest不返回电子邮件(Swift)

我目前正在创建一个使用Facebook SDK登录并返回用户信息的iOS应用程序。

我已成功登录Facebook并接收请求的信息。但是,尽管允许电子邮件的读取权限,但请求并未返回电子邮件。

/******************** 
    Place Facebook login button 
    *********************/ 
    let loginButton = FBSDKLoginButton() 
    view.addSubview(loginButton) 
    loginButton.delegate = self 
    loginButton.readPermissions = ["email", "public_profile"] 
    //add button constraints 
    loginButton.center = view.center 



} 

/** 
* Functions called when user handed back from facebook login 
**/ 
func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { 
    print("Did log out of facebook") 
} 
/** 
* Functions called when user handed back from facebook login 
**/ 
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 
    if error != nil { 
     print(error) 
    } else 
    { 
     print("Successfully logged in with facebook") 
     FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start 
      { (connection, result, err) in 
      if err != nil{ 
       print("Failed to start graph request: ", err) 
       return 
      } 
      print(result) 
     } 
    } 
} 
+0

电子邮件仅返回并验证它已经。此外,即使用户授予了权限,在隐私设置使其不会返回电子邮件的情况下也存在一些罕见的情况。如果你的应用程序绝对需要一封电子邮件,那么你应该实施一个额外的步骤,让用户手动输入它(当然,验证也成为你的责任)...并非每个用户甚至都有一个电子邮件存档在Facebook上,例如,如果他们只使用他们的手机注册。 – CBroe

回答

0

根据Facebook Graph API tool,您无法从FBSDKGraphRequest获取用户电子邮件。 Facebook只会返回用于登录的令牌。如果您使用Facebook登录Firebase,则可以使用CurrentUser.currentEmail方法获取电子邮件。如果用户已经确认

let login = FBSDKLoginManager() 

    login.logIn(withReadPermissions: ["email","user_posts","public_profile"], from: self, handler: { 
     (result: FBSDKLoginManagerLoginResult?, error: Error?) in 
     if error != nil { 
      print("Process error") 
      return 
     } 
     else if (result?.isCancelled)! { 
      print("Cancelled") 
     } 
     else { 
      //Success! 
      let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 
      self.firebaseLogin(credential) 
     } 
    }) 
+0

好的,谢谢。我发现Firebase在用户注册时不会存储任何电子邮件地址。我会找到解决办法。再次感谢 –

+0

对,在Swift 2和较旧版本的Firebase + Facebook SDK中,上面的方法是允许的,但现在您可以直接写'FIRAuth.auth()?currentUser?.email' – Fallah

0
import FBSDKCoreKit 
     import FBSDKLoginKit 
     import FBSDKShareKit 


     @IBAction func btnFbPressed(_ sender: Any) { 

      let loginManager = FBSDKLoginManager() 

      loginManager.logIn(withReadPermissions: ["public_profile", "email"], from: self) { (loginResult, error) in 

       if error != nil { 
        print(error!) 

       } 
       else { 

        if (loginResult?.grantedPermissions.contains("email"))! { 
         self.getFBUserData() 
        } 

       } 
      } 


     } 




     func getFBUserData(){ 
      if((FBSDKAccessToken.current()) != nil){ 

       UserDefaults.standard.set(FBSDKAccessToken.current().tokenString, forKey: "fbToken") 

       FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in 
        if (error == nil) { 

         print(result as Any) 

         let dictionary = result as! NSDictionary 
         print(dictionary) 

         let hud = MBProgressHUD.showAdded(to: self.view, animated: true) 
         hud.tintColor = .black 
         hud.mode = .indeterminate 
         hud.label.text = "Loading" 
         hud.animationType = .fade 
         hud.show(animated: true) 

         let postString = String(format: "login_type=facebook&email=%@&id=%@&device=0", arguments: [dictionary.value(forKey: "email") as! String, dictionary.value(forKey: "id") as! String]) 
    } 
       }) 
      } 
     } 
相关问题