无法使用 swift 3 和 ios 10 从 Facebook 检索电子邮件

Cannot retrieve email from facebook using swift 3 and ios 10

你好,我正在尝试使用 swift 玩 facebook ios sdk 时从 facebook 检索我的电子邮件。 IOS 平台是 10,swift 3 和 Xcode 8。我按照在线教程进行操作,但无法检索电子邮件。

下面是我的代码:

if FBSDKAccessToken.current() == nil {
            print("I got token")
            let fbButton = FBSDKLoginButton()
            fbButton.readPermissions = ["public_profile", "email", "user_friends"]
            view.addSubview(fbButton)
            fbButton.center = view.center
            fbButton.delegate = self
            self.fetchprofile()
        }

        else {
            print("Dont have token")
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = self.view.center
            loginView.readPermissions = ["public_profile", "email", "user_friends"]
            loginView.delegate = self
        }

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if error != nil {
            print(error.localizedDescription)
            return
        }
        print("I'm in")
        fetchprofile()
    }

func fetchprofile() {

        print("Getting profile")

        let parameters = ["fields": "email"]

        let graphRequest:FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: parameters, httpMethod: "GET")

        graphRequest.start(completionHandler: {(connection, result, error) -> Void in

            if error != nil {
                print("Error retrieving details: \(error?.localizedDescription)")
                return
            }

            guard let result = result as? [String:[AnyObject]], let email = result["email"] else {
                return
            }
            print("Email: \(email)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
            self.view.backgroundColor = UIColor.red

        })
    }

在我的 appdelegate.swift 文件中:

 //have both google and facebook signin. Google works but facebook doesn't
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                    sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
                                                    annotation: options[UIApplicationOpenURLOptionsKey.annotation]) ||
        FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    }

我可以登录和注销,但无法检索电子邮件。

UPDATE 实际上,当我实际传递 print(email) 时,我可以在控制台上看到它作为可选语句。如果没有可选的 statment

,我无法显示它

我是这样解决问题的:

func fetchProfile(){
     FBSDKGraphRequest(graphPath: "/me", parameters: ["fields" : "email, name, id, gender"])
        .start(completionHandler:  { (connection, result, error) in
            guard let result = result as? NSDictionary, let email = result["email"] as? String,
                let user_name = result["name"] as? String,
                let user_gender = result["gender"] as? String,
                let user_id_fb = result["id"]  as? String else {
                    return
            }         
        })

    }

在 graphPath 参数中没有“/”的情况下,这个解决方案对我来说效果很好!
FBSDKGraphRequest(graphPath: "me" .....