Swift和Parse(以及xCode)问题

时间:2015-01-10 11:27:31

标签: xcode facebook swift login parse-platform

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)不起作用。我导入了框架(我添加了桥接头),它在几天前就可以使用了。

1 个答案:

答案 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个小时。