Till96
Till96

Reputation: 87

Get Facebook Profile picture at Sign-up for Parse backend (Swift)

I'm creating an application with Parse as backend service. My users should be able to sign-up and login via Facebook.

I did this in the following (works absolutely fine).

@IBAction func registerWithFacebook(sender: UIButton) {
    let permissions:[String] = ["user_about_me","user_relationships", "public_profile"]
    PFFacebookUtils.logInWithPermissions(permissions, {
        (user: PFUser!, error: NSError!) -> Void in
        if user == nil {
            NSLog("Uh oh. The user cancelled the Facebook login.")
        } else if user.isNew {
            NSLog("User signed up and logged in through Facebook!")
            self.loadData()
            self.performSegueWithIdentifier("initialToMain", sender: self)
        } else {
            NSLog("User logged in through Facebook!")
            self.performSegueWithIdentifier("initialToMain", sender: self)
        }
    })
}

func loadData(){
    let request:FBRequest = FBRequest.requestForMe()
    request.startWithCompletionHandler { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
        if error == nil{
            if let dict = result as? Dictionary<String, AnyObject>{
                let name:String = dict["name"] as AnyObject? as String
                let email:String = dict["email"] as AnyObject? as String

                println(name)
                PFUser.currentUser().setValue(name, forKey: "username")
                PFUser.currentUser().setValue(email, forKey: "email")
                PFUser.currentUser().save()
            }
        }
    }
}

Unfortunately I wasn't able to get the profile picture from the user who's signing up. How can I do that?

Upvotes: 1

Views: 3732

Answers (2)

Till96
Till96

Reputation: 87

Here's the working solution:

    func loadData(){
    let request:FBRequest = FBRequest.requestForMe()
    request.startWithCompletionHandler { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in
        if error == nil{
            if let dict = result as? Dictionary<String, AnyObject>{
                let name:String = dict["name"] as AnyObject? as String
                let facebookID:String = dict["id"] as AnyObject? as String
                let email:String = dict["email"] as AnyObject? as String

                let pictureURL = "https://graph.facebook.com/\(facebookID)/picture?type=large&return_ssl_resources=1"

                var URLRequest = NSURL(string: pictureURL)
                var URLRequestNeeded = NSURLRequest(URL: URLRequest!)


                NSURLConnection.sendAsynchronousRequest(URLRequestNeeded, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!, error: NSError!) -> Void in
                    if error == nil {
                        var picture = PFFile(data: data)
                        PFUser.currentUser().setObject(picture, forKey: "profilePicture")
                        PFUser.currentUser().saveInBackground()
                    }
                    else {
                        println("Error: \(error.localizedDescription)")
                    }
                })
                PFUser.currentUser().setValue(name, forKey: "username")
                PFUser.currentUser().setValue(email, forKey: "email")
                PFUser.currentUser().saveInBackground()
            }
        }
    }
}

Upvotes: 1

dotcomly
dotcomly

Reputation: 2214

The picture is publicly available via the user id at the following url:

https://graph.facebook.com/USER_ID/picture

You can also request various sizes:

https://graph.facebook.com/USER_ID/picture?width=300&height=300

Upvotes: 3

Related Questions