Search code examples
objective-cfacebook-graph-apiswiftfacebook-ios-sdk

Objective-C to Swift: Facebook iOS API requestUserInfo method


Hi I am trying to figure out how to rewrite this in swift:

- (IBAction)requestUserInfo:(id)sender
{
  // We will request the user's public picture and the user's birthday
  // These are the permissions we need:
  NSArray *permissionsNeeded = @[@"public_profile", @"user_birthday", @"email"];

  // Request the permissions the user currently has
  [FBRequestConnection startWithGraphPath:@"/me/permissions" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
      if (!error){
        // Parse the list of existing permissions and extract them for easier use
        NSMutableArray *currentPermissions = [[NSMutableArray alloc] init];
        NSLog(@"The fucking class is: %@", [result class]);
        NSArray *returnedPermissions = (NSArray *)[result data];
        for (NSDictionary *perm in returnedPermissions) {
          if ([[perm objectForKey:@"status"] isEqualToString:@"granted"]) {
            [currentPermissions addObject:[perm objectForKey:@"permission"]];
          }
        } // cut cut here

}

EDIT:

I was having trouble trying to get the required data out of the FBGraphObject but figured it out after some further inspection. I have posted the swift version below so that people can just cut and paste it and get on with using swift. Hope it saves someone some time.


Solution

  • Here:

    @IBAction func requestUserInfo(sender: AnyObject){
        // These are the permissions we need:
        var permissionsNeeded = ["public_profile", "user_birthday", "email"]
    
        // Request the permissions the user currently has
        FBRequestConnection.startWithGraphPath("/me/permissions", completionHandler: {(connection, result, error) -> Void in
    
            if error == nil{
                // Parse the list of existing permissions and extract them for easier use
    
                var theResult = result as? [String:[AnyObject]]
                var currentPermissions = [String]()
                let returnedPermissions = theResult?["data"] as [[String:String]]
    
                for perm in returnedPermissions {
                    if perm["status"] == "granted" {
                        currentPermissions.append(perm["permission"]!)
                    }
                }
    
                // Build the list of requested permissions by starting with the permissions
                // needed and then removing any current permissions
                println("Needed: \(permissionsNeeded)")
                println("Current: \(currentPermissions)")
    
                var requestPermissions = NSMutableArray(array: permissionsNeeded, copyItems: true)
                requestPermissions.removeObjectsInArray(currentPermissions)
    
                println("Asking: \(requestPermissions)")
    
                // TODO PUT A POPUP HERE TO TELL WHAT PERMISSIONS WE NEED!
    
                // If we have permissions to request
                if requestPermissions.count > 0 {
                    // Ask for the missing permissions
                    FBSession.activeSession().requestNewReadPermissions(requestPermissions, completionHandler: {(session, error) -> Void in
                        if (error == nil) {
                            // Permission granted, we can request the user information
                            self.makeRequestForUserData()
                        } else {
                            // An error occurred, we need to handle the error
                            // Check out our error handling guide: https://developers.facebook.com/docs/ios/errors/
                            println("error: \(error?.description)")
                        }
                    })
                } else {
                    // Permissions are present
                    // We can request the user information
                    self.makeRequestForUserData()
                }
    
            } else {
                // An error occurred, we need to handle the error
                // Check out our error handling guide: https://developers.facebook.com/docs/ios/errors/
                println("error: \(error?.description)")
            }
        })
    }
    
    private func makeRequestForUserData() {
        FBRequestConnection.startForMeWithCompletionHandler({(connection, result, error) -> Void in
            if (error == nil) {
                // Success! Include your code to handle the results here
                println("user info: \(result)")
            } else {
                // An error occurred, we need to handle the error
                // Check out our error handling guide: https://developers.facebook.com/docs/ios/errors/
                println("error: \(error?.description)")
            }
        })
    }
    
    
    // Show an alert message
    func showMessage(text : NSString, title : NSString){
        var alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        UIApplication.sharedApplication().delegate?.window!?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
    }