尝试获取用户的电子邮件时,FBSDKLoginManagerLoginResult valueForUndefinedKey

问题描述 投票:1回答:2

我正在尝试从FBSDKLoginManagerLoginResult获取用户的姓名,电子邮件和ID,并收到错误消息:

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:此类不是密钥值编码兼容的密钥电子邮件。

这是代码:

   class ViewController: UIViewController, FBSDKLoginButtonDelegate {

        @IBOutlet weak var fbLogin: FBSDKLoginButton!
        override func viewDidLoad() {
            super.viewDidLoad()
       fbLogin.readPermissions = ["public_profile", "email"]
            fbLogin.delegate = self
    }

        func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {


            if ((error) != nil)
            {
                NSLog("User Logged In")
            }
            else if result.isCancelled {
                 NSLog("User cancels")
            }
            else {
                if result.grantedPermissions.contains("email")
                {             
                   let userEmail : String = result.valueForKey("email") as! String //here I get crash
                    NSLog("User Email is: \(userEmail)")
                }
            }
        }
    }

另外,我找不到可用密钥列表

swift facebook-ios-sdk
2个回答
4
投票

看起来你需要制作一个FBSDKGraphRequest。我有

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

    if ((error) != nil) {
        // Process error
    } else if result.isCancelled {
        // Handle cancellations
    } else {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id, email, name"])
        graphRequest.start(completionHandler: { (connection, result, error) -> Void in
            if ((error) != nil) {
                print("Error: \(error)")
            } else {
                if let user : NSString = result!.value(forKey: "name") as? NSString {
                    //print("user2: \(user)")
                    self.userLabel.text = "Logged in as \(user)"
                }
                if let id : NSString = result!.value(forKey: "id") as? NSString {
                    self.fbId = id
                    //print("id: \(id)")
                }
                if let email : NSString = result!.value(forKey: "email") as? NSString {
                    print("email: \(email)")
                }
            }
        })
    }
}

这个例子是使用swift ver。 3(xcode beta 3)。


1
投票

在Swift 4中:

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if ((error) != nil) {
           // ERROR
        }
        else if result.isCancelled {
            // CANCELATION
        }
        else {
            let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id, email, name"])
            graphRequest.start(completionHandler: { (connection, result, error) -> Void in
                if ((error) != nil) {
                    FBSDKLoginManager().logOut()
                } else {
                    if let idfb : NSString = (result! as AnyObject).value(forKey: "id") as? NSString {
                        print("ID FROM FACEBOOK: \(idfb)")
                    }
                    if let name : NSString = (result! as AnyObject).value(forKey: "name") as? NSString {
                        print("NAME IN FACEBOOK: \(name)")
                    }
                    if let email : NSString = (result! as AnyObject).value(forKey: "email") as? NSString {
                        print("EMAIL IN FACEBOOK: \(email)")
                    }
                }
            })
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.