Parse和Swift遇到麻烦。 我正在尝试使用Parse类PFFacebookUtils进行Facebook登录。 这就是代码:
// LOG IN or SIGN UP with FACEBOOK
@IBAction func FacebookLogin() {
PFFacebookUtils.logInWithPermissions(permissions, {(user: PFUser!, error: NSError!) -> Void in
if error == nil {
if user == nil {
NSLog("Uh oh. The user cancelled the Facebook login.")
let userCancelledAlert = UIAlertController(title: "Error", message: "You cancelled the Facebook Login", preferredStyle: .Alert)
let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)
userCancelledAlert.addAction(okButton)
let cancelButton = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
userCancelledAlert.addAction(cancelButton)
self.presentViewController(userCancelledAlert, animated: true, completion: nil)
} else if user.isNew {
NSLog("User signed up and logged in through Facebook!")
FBRequestConnection.startWithGraphPath("me?fields=email", completionHandler: { (connection, result, error) -> Void in
if error == nil {
let fbGraphicObject = result as FBGraphObject
println(fbGraphicObject)
}
})
} else {
NSLog("User logged in through Facebook!")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
var homeViewController = self.storyboard?.instantiateViewControllerWithIdentifier("homePage") as HomeViewController
self.presentViewController(homeViewController, animated: true, completion: nil)
})
// end login (success)
}
} else { // if login doesnt work
println(error!)
/*
let facebookError = UIAlertController(title: "Error", message: "Cant connect to Facebook, check your connectivity", preferredStyle: .Alert)
let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)
facebookError.addAction(okButton)
let cancelButton = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
facebookError.addAction(cancelButton)
self.presentViewController(facebookError, animated: true, completion: nil)
*/
}
})
}
所以现在我的问题是:为什么我在注册时看不到权限是什么? 我的意思是,权限是一个数组。
let permissions = ["email","user_birthday"]
但是当我注册消息时,“[APP-NAME]”想要访问您的基本信息和朋友列表。 为什么不是电子邮件或user_birthday。 然后,我如何将这些信息存储在我的Parse数据库中?我的意思是,我看到id,用户名,密码(显然,我没有),authData等。 我有电子邮件字段,但它是空的。 我想代码中有问题。谁能找到? 最后,不知道为什么,但是对于Parse类的xCode自动完成(我使用的是Swift)不起作用。我导入了框架(我添加了桥接头),它在几天前就可以使用了。
答案 0 :(得分:1)
我正在研究同样的事情,试图让Parse将Facebook电子邮件存储为用户名而不是自动生成的id。由于Facebook将Graph API更新为v2.0,似乎没有太多可以告诉你如何做到这一点。这就是我所做的:
首先,我设置了从Facebook检索电子邮件的适当权限。这是在" didLoginUser"方法
func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) {
if !PFFacebookUtils.isLinkedWithUser(user) {
let facebookLinkSuccess : (succeeded: Bool, error: NSError?) -> Void = { succeeded, error in
if(succeeded){
println("PF User linked with facebook")
}
}
PFFacebookUtils.linkUserInBackground(user, withReadPermissions: ["public_profile", "email", "user_friends","user_birthday","user_location"], block: facebookLinkSuccess)
} ...
其次,我发现了这个stackoverflow,它可以帮助你调用FB Graph API,然后使用所需的值更新Parse PFUser对象:Facebook iOS SDK & Swift - How do I create dependent batch requests?
我按如下方式设置了呼叫:
if (FBSDKAccessToken.currentAccessToken() != nil){
var userProfileRequestParams = [ "fields" : "id, name, email"]
let userProfileRequest = FBSDKGraphRequest(graphPath: "me", parameters: userProfileRequestParams)
let graphConnection = FBSDKGraphRequestConnection()
graphConnection.addRequest(userProfileRequest, completionHandler: { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
if(error != nil){
println(error)
}
else {
let fbEmail = result.objectForKey("email") as! String
let fbUserId = result.objectForKey("id") as! String
if(fbEmail != "") {
PFUser.currentUser()?.username = fbEmail
PFUser.currentUser()?.saveEventually(nil)
}
println("Email: \(fbEmail)")
println("FBUserId: \(fbUserId)")
}
})
graphConnection.start()
}
我把这段代码放进去了 func logInViewController(logInController:PFLogInViewController,didLogInUser用户:PFUser){...
如果您对该部分有疑问,请查看此视频,它有类似的想法,但有Twitter。 https://www.youtube.com/watch?v=lnf7KHHeiO0
希望这有助于某人。我只花了将近5个小时。