如何在Swift iOS for iPhone中使用FBSDK获取用户的电子邮件地址?

问题描述:

我是一名自学新手,正在开发使用swift的iPhone应用程序。我正在设计一个使用FBSDK进行Facebook身份验证的登录页面。我已经成功实现了登录和注销登录按钮。它返回用户名和ID,但它无法图表用户电子邮件ID,并显示代码2500错误。此外,我无法使用新用户登录。它会自动使用同一个用户登录。如何在Swift iOS for iPhone中使用FBSDK获取用户的电子邮件地址?

以下是错误:

UserInfo={com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey=0, com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey=400, com.facebook.sdk:FBSDKErrorDeveloperMessageKey=An active access token must be used to query information about the current user., com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode=2500, com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey={ 
    body =  { 
     error =   { 
      code = 2500; 
      "fbtrace_id" = BimF4Nuqx0v; 
      message = "An active access token must be used to query information about the current user."; 
      type = OAuthException; 
     }; 
    }; 
    code = 400; 
}}) 
Successfully logged in with Facebook... 
123 
result Optional({ 
    id = 120008981838163; 
    name = "Nisha Ios"; 
}) 
Did Logout of Facebook 

这是我在AppDelegate.swift代码:

import UIKit 
import CoreData 
import FBSDKCoreKit 


@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 

     FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 

     return true 
    } 


    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { 

     var handled=FBSDKApplicationDelegate.sharedInstance().application(app, open: url, 
                      sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 

return handled 
} 

    func applicationWillResignActive(_ application: UIApplication) { 
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
     FBSDKAppEvents.activateApp() 
    } 

这是我在ViewController.swift代码:

import UIKit 
import FBSDKLoginKit 
import FBSDKCoreKit 


class ViewController: UIViewController, UITextFieldDelegate, FBSDKLoginButtonDelegate, { 


    @IBOutlet var emailField: UITextField! 

    @IBOutlet var passField: UITextField! 

    @IBOutlet var customButton: FBSDKLoginButton! 


    @IBOutlet var myView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.emailField.delegate = self; 
     self.passField.delegate = self; 

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

     customButton.addTarget(self, action: #selector(handleCustomFBLogin), for: UIControlEvents.touchUpInside) 

func handleCustomFBLogin(){ 

    // FBSDKLoginManager().logIn(withReadPermissions: ["email","public_profile"], from: self) 
    // { (result, error) -> Void in 
    // if error != nil { 
     // print("custom FB Login Failed",error) 
     //  } 
    //} 
       self.showEmail() 
       print(123) 
     } 


    func showEmail() 
    { 
     FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "email, id, name"]).start { 
      (connection, result, err) in 
      if(err == nil) 
      { 
       print("result \(result)") 
      } 
      else 
      { 
       print("error \(err)") 
      } 
     } 

    } 

    public func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { 

     if error != nil 
     { 
      print(error) 
      return 

     } 
     else{ 
      print("Successfully logged in with Facebook... ") 

     } 
     //showEmail() 
    } 

    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!){ 

     print("Did Logout of Facebook") 

    } 

在这里函数handleCustomFBLogin(),我已经评论了一些代码。如果我取消注释他们,我无法获得用户名或ID,只能得到代码2500错误。

有人能告诉我我做错了什么吗?还帮我用新用户登录,而不是用同一个用户自动登录? 非常感谢您提前致谢:-)

+1

http://stackoverflow.com/questions/9347104/register-with-facebook-sometimes-doesnt-provide-email/18377407#18377407 –

我正在使用它,它对我的​​工作很好。请确保您使用的帐户具有公开的电子邮件和其他详细信息。您只能获得Facebook用户的公开详细信息。其次,你的代币应该是有效的。

func getFBUserData() 
    { 

      showIndicator() 

      if((FBSDKAccessToken.currentAccessToken()) != nil 

      { 

       FBSDKGraphRequest(graphPath: "me", 

            parameters: ["fields": "id, name, first_name, last_name, picture.type(large), email , gender"]).startWithCompletionHandler(

            { (connection, result, error) -> Void in 

             self.hideIndicator() 

        if (error == nil) 

        { 

         self.objSocialInfo = SignupUserStructure() 

         self.objSocialInfo.Name = String(result.objectForKey("first_name")!) + " " + String(result.objectForKey("last_name")!) 

         self.objSocialInfo.Email = String(result.objectForKey("email")!) 

         self.objSocialInfo.ProfilePicUrl = (result.objectForKey("picture")?.objectForKey("data")?.objectForKey("url") as? String)! 

         self.objSocialInfo.SocialId = String(result.objectForKey("id")!) 

         self.objSocialInfo.Gender = String(result.objectForKey("gender")!) 

        }}) 
      } 
    } 
+0

太谢谢你了。我的电子邮件未被验证。这就是为什么它不会返回用户电子邮件。当我添加FBSDKAccessToken条件时,该错误已被清除。再次感谢。 – Nisha

+0

欢迎@Nisha快乐的帮助。你可以接受我的回答。 – ChanWarde

+0

:-)我做到了。谢谢 – Nisha