获取 Facebook 电子邮件并保存到 Parse.com
Get Facebook email and save to Parse.com
下面的代码添加了解析登录和注册表单。但是当我使用 Facebook 字段时,它会登录用户但不会更新电子邮件字段。
有没有办法更新电子邮件字段?
func showLogInPage() {
var loginViewController = PFLogInViewController()
loginViewController.delegate = self
loginViewController.fields = (PFLogInFields.UsernameAndPassword | PFLogInFields.LogInButton | PFLogInFields.SignUpButton | PFLogInFields.PasswordForgotten | PFLogInFields.Facebook)
var signupViewController = PFSignUpViewController()
signupViewController.delegate = self
loginViewController.signUpController = signupViewController
self.presentViewController(loginViewController, animated: true, completion: nil)
}
在 PFLogInViewControllerDelegate
内部有一个回调,当使用 Facebook 登录时会触发回调 logInViewController:didLogInUser
。在这里您可以从 Facebook SDK 检索电子邮件并将其存储在 PFUser
中。我在这里做了一个小例子:
// MARK: - PFLogInViewControllerDelegate
func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) {
updatePFUserEmail()
}
func updatePFUserEmail() {
if (FBSDKAccessToken.currentAccessToken() != nil) {
FBSDKGraphRequest(graphPath: "me", parameters: nil).startWithCompletionHandler({ (connection, result, error) in
if (error != nil) { return }
if let user = result as? NSDictionary {
if let email = user.objectForKey("email") as? String {
PFUser.currentUser()?.email = email
PFUser.currentUser()?.saveInBackground()
}
else {
PFUser.currentUser()?.email = ""
PFUser.currentUser()?.saveInBackground()
}
}
})
}
}
更新 1
缺少 FB 权限设置
您需要在 showLogInPage
中指定 Facebook 权限才能阅读用户的电子邮件。您可以通过以下方式执行此操作:
loginViewController.facebookPermissions = ["email"]
对于更新到 Xcode 7 和 Swift 2.0 的用户,语法如下:
重写 func viewDidAppear(动画:布尔)
{
super.viewDidAppear(动画)
if (PFUser.currentUser() == nil) {
self.loginViewController.fields =
[PFLogInFields.UsernameAndPassword,
PFLogInFields.LogInButton,
PFLogInFields.SignUpButton,
PFLogInFields.PasswordForgotten,
PFLogInFields.DismissButton,
PFLogInFields.Twitter,
PFLogInFields.Facebook]
self.loginViewController.delegate = self
self.signupViewController.delegate = self
self.presentViewController(loginViewController, animated: true, completion: nil)
}
}
下面的代码添加了解析登录和注册表单。但是当我使用 Facebook 字段时,它会登录用户但不会更新电子邮件字段。
有没有办法更新电子邮件字段?
func showLogInPage() {
var loginViewController = PFLogInViewController()
loginViewController.delegate = self
loginViewController.fields = (PFLogInFields.UsernameAndPassword | PFLogInFields.LogInButton | PFLogInFields.SignUpButton | PFLogInFields.PasswordForgotten | PFLogInFields.Facebook)
var signupViewController = PFSignUpViewController()
signupViewController.delegate = self
loginViewController.signUpController = signupViewController
self.presentViewController(loginViewController, animated: true, completion: nil)
}
在 PFLogInViewControllerDelegate
内部有一个回调,当使用 Facebook 登录时会触发回调 logInViewController:didLogInUser
。在这里您可以从 Facebook SDK 检索电子邮件并将其存储在 PFUser
中。我在这里做了一个小例子:
// MARK: - PFLogInViewControllerDelegate
func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) {
updatePFUserEmail()
}
func updatePFUserEmail() {
if (FBSDKAccessToken.currentAccessToken() != nil) {
FBSDKGraphRequest(graphPath: "me", parameters: nil).startWithCompletionHandler({ (connection, result, error) in
if (error != nil) { return }
if let user = result as? NSDictionary {
if let email = user.objectForKey("email") as? String {
PFUser.currentUser()?.email = email
PFUser.currentUser()?.saveInBackground()
}
else {
PFUser.currentUser()?.email = ""
PFUser.currentUser()?.saveInBackground()
}
}
})
}
}
更新 1
缺少 FB 权限设置
您需要在 showLogInPage
中指定 Facebook 权限才能阅读用户的电子邮件。您可以通过以下方式执行此操作:
loginViewController.facebookPermissions = ["email"]
对于更新到 Xcode 7 和 Swift 2.0 的用户,语法如下:
重写 func viewDidAppear(动画:布尔) { super.viewDidAppear(动画)
if (PFUser.currentUser() == nil) {
self.loginViewController.fields =
[PFLogInFields.UsernameAndPassword,
PFLogInFields.LogInButton,
PFLogInFields.SignUpButton,
PFLogInFields.PasswordForgotten,
PFLogInFields.DismissButton,
PFLogInFields.Twitter,
PFLogInFields.Facebook]
self.loginViewController.delegate = self
self.signupViewController.delegate = self
self.presentViewController(loginViewController, animated: true, completion: nil)
}
}