Swift 和 Parse(以及 xCode)问题

Posted

技术标签:

【中文标题】Swift 和 Parse(以及 xCode)问题【英文标题】:Swift and Parse (and xCode) problems 【发布时间】:2015-01-10 11:27:31 【问题描述】:

在使用 Parse 和 Swift 时遇到一些麻烦。 我正在尝试将 Facebook 登录与 Parse 类 PFFacebookUtils 一起使用。 代码如下:

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

【问题讨论】:

在进入logInWithPermissions之前,可以println(permissions)看看里面有什么吗?至于XCode,可能与***.com/questions/24006206/…有关 @BabyAzerty ,权限包含“[email, user_birthday]”,正如我设置的那样。是的,我以前读过那篇文章,但这不是我的问题。我没有任何消息或黑窗。简单地说,xCode 编辑器并没有向我提供任何关于 Parse 框架(类、方法或属性)的建议 【参考方案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)
     ...

其次,我找到了这个 ***,它可以帮助您进行 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 user: PFUser) ...

如果您对该部分有任何疑问,请观看此视频,它有类似的想法,但使用的是 Twitter。 https://www.youtube.com/watch?v=lnf7KHHeiO0

希望这对某人有所帮助。我只花了将近 5 个小时。

【讨论】:

以上是关于Swift 和 Parse(以及 xCode)问题的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 在 Xcode 中使用 Parse 1.7.2 和 Facebook SDK 4.1 创建新用户

如果在 Parse 中找到,则输入邮政编码切换视图控制器(Swift 和 XCode)

XCode - Swift - 使用 Parse 进行 Facebook 身份验证

Facebook 使用 Parse SDK 登录(iOS 9、Xcode 7.1、Swift 2.1)

如何在 Swift Xcode 6.4 的 TableView 中显示 Parse 数组

Swift 无法从 parse.com 检索图像