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

3
我是一名自学的初学者,正在使用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

这是我的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
https://dev59.com/NGox5IYBdhLWcg3wOx1i#18377407 - Bhavin Bhadani
1个回答

7

我使用了这个功能,它对我很有效。请确保您用来登录的帐户已公开电子邮件和其他详细信息。您只能获取Facebook用户的公开详细信息。其次,请确保您的token是有效的。

   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")!)

                    }})
            }
    }

非常感谢。我的电子邮件没有通过验证。这就是为什么它不能返回用户电子邮件的原因。当我添加了 FBSDKAccessToken 条件后,该错误被清除。再次感谢。 - Nisha
欢迎 @Nisha,很高兴能帮助你。尽管你可以接受我的回答。 - Chanchal Warde
我已经完成了。谢谢。 - Nisha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接