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

Nis*_*sha 3 ios facebook-login fbsdk swift3

我是使用Swift快速学习的自学开发iPhone应用程序。我正在设计一个使用FBSDK进行Facebook身份验证的登录页面。我已经成功实现了登录和注销的登录按钮。它返回用户名和ID,但无法绘制用户电子邮件ID的图形,并显示代码2500错误。另外,我无法使用新用户登录。它会自动以同一用户登录。

这是错误:

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
Run Code Online (Sandbox Code Playgroud)

这是我在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()
    }
Run Code Online (Sandbox Code Playgroud)

这是我在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")

    }
Run Code Online (Sandbox Code Playgroud)

在这里,在func handleCustomFBLogin()中,我注释了一些代码。如果我取消注释,我将无法获得用户名或ID,而只会得到代码2500错误。

有人可以告诉我我做错了吗?还可以帮助我使用新用户登录,而不是自动使用同一用户登录吗?在此先感谢:-)

Cha*_*rde 5

我正在使用它,它对我来说很好用。请确保您用于登录的帐户公开了电子邮件和其他详细信息。您只能获取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")!)

                    }})
            }
    }
Run Code Online (Sandbox Code Playgroud)