I am not able to fetch user data from Facebook in iOS

740 views Asked by At

I am new to iPhone programming.Using below code i am login into Facebook and fetching data.But here problem is if click on the Loginwithfacebook button Facebook dialog box opening.there i am enter username and password of Facebook after that if again click on same button then i am getting user data.But i don't want to click on double time.And also once i login in Facebook.inside the app where i want to fetch user data at that time i don't to login one more time until i click on logout.Please give me best idea.

-(void)LoginWithFacebookk:(id)sender
{ 
   if (!FBSession.activeSession.isOpen) {

    FBSession *session = [[FBSession alloc] init];
    // Set the active session
    [FBSession setActiveSession:session];
    // Open the session
    [session openWithBehavior:FBSessionLoginBehaviorForcingWebView
            completionHandler:^(FBSession *session,
                                FBSessionState status,
                                NSError *error)
     {


            }];

        }
        else
        {
            NSLog(@"open response");
            FBRequest* friendsRequest = [FBRequest requestForMe];
            [friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection,NSDictionary <FBGraphUser> *user,NSError *error) {

                NSString *emailiddd=[NSString stringWithFormat:@"%@",[user objectForKey:@"email"]];

                NSLog(@"%@",emailiddd);
                NSString *post = [NSString stringWithFormat:@"email=%@",emailiddd];

                NSLog(@"%@",post);

     }];
               }
    }
}
2

There are 2 answers

1
Nitin Gohel On BEST ANSWER

if you are checking sample code of provide by Facebook in FacebookSDK there is one sample SessionLoginSampleplease check how did work:-

You have to configur you app like this:-

enter image description here

in Native iOS app you have to set you app Bundle Id that you are using in to you Project for example(com.compame.projecname)

For implement in to your Project Here i put the explain.

in .h file create One Button with IBOutlet and connect this button in to xib as we did normally

#import <FacebookSDK/FacebookSDK.h>


@interface LoginViewController : UIViewController<FBLoginViewDelegate>
{
    IBOutlet UIButton *FB_login; // just connect IBoutlate no need to give IBAction
    FBLoginView *loginview;

}
@property (strong, nonatomic) id<FBGraphUser> loggedInUser;
@property (strong, nonatomic) IBOutlet FBProfilePictureView *profilePic; //this is for show profile pic or logged in user

in .m File @implementation LoginViewController @synthesize profilePic = _profilePic;

- (void)viewDidLoad
{
    loginview = [[FBLoginView alloc] init];
    loginview =
    [[FBLoginView alloc] initWithPublishPermissions:[NSArray arrayWithObjects:@"publish_actions",@"email",nil] defaultAudience:FBSessionDefaultAudienceFriends];

    loginview.frame =FB_login.frame;//CGRectMake(90,149, 280, 55);
    for (id obj in loginview.subviews)
    {
        if ([obj isKindOfClass:[UIButton class]])
        {
            UIButton * loginButton =  obj;

            UIImage *loginImage = [UIImage imageNamed:@"btn_fb_login.png"];
            [loginButton setBackgroundImage:loginImage forState:UIControlStateNormal];
            [loginButton setBackgroundImage:nil forState:UIControlStateSelected];
            [loginButton setBackgroundImage:nil forState:UIControlStateHighlighted];
            [loginButton sizeToFit];
        }
        if ([obj isKindOfClass:[UILabel class]])
        {
            UILabel * loginLabel =  obj;
            loginLabel.text =@""; //@"Log in to facebook";
            loginLabel.textAlignment = NSTextAlignmentCenter;
            loginLabel.frame =CGRectMake(123,149, 280, 55);// CGRectMake(0, 0, 271, 37);
        }
    }

    loginview.delegate = self;

    [self.view addSubview:loginview];

    [super viewDidLoad];

}

-(void)LogOut:(NSNotification *)notif
{
    [self loginViewShowingLoggedOutUser:loginview];
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *each in cookieStorage.cookies) {
        // put a check here to clear cookie url which starts with twitter and then delete it
        [cookieStorage deleteCookie:each];
    }
}

#pragma  mark------ FaceBook Sign In method------------

- (void)loginViewShowingLoggedInUser:(FBLoginView *)loginView {

    NSLog(@"Logged In");


}

- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                            user:(id<FBGraphUser>)user {

    NSLog(@"%@",user);
    self.profilePic.profileID = user.id;





}
- (void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView {
    // Called after logout
    NSLog(@"Logged out");

    self.profilePic.profileID = nil;
    [FBSession.activeSession closeAndClearTokenInformation];


}
- (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error {
    // see https://developers.facebook.com/docs/reference/api/errors/ for general guidance on error handling for Facebook API
    // our policy here is to let the login view handle errors, but to log the results
    NSLog(@"FBLoginView encountered an error=%@", error);
}

NOTE:- If you are trying to set Image of logged in user using FBProfilePictureView do not forget add [FBProfilePictureView class]; in to app Delegate like Bellow

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [FBProfilePictureView class];
    // Override point for customization after application launch.
    return YES;
}

Here it is a sample code for you Sample code Facebook log-in with Image

2
Dani Pralea On

If you are willing to, you can also do it with Parse :

- (IBAction)facebookRegistrationButtonPressed {

        // The permissions requested from the user

        NSArray *permissionsArray = @[@"email", @"user_about_me", @"publish_actions", @"status_update", @"manage_pages", @"publish_stream"];

        // Login PFUser using Facebook
        [PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) {
            if (!user) {
                if (!error) {
                    NSLog(@"Uh oh. The user cancelled the Facebook login.");
                } else {
                    NSLog(@"Uh oh. An error occurred: %@", error);
                }
            } else if (user.isNew) {
                NSLog(@"User with facebook signed up and logged in!");
                [self processFacebookRequest];
            } else {
                NSLog(@"User with facebook logged in!");
                [self processFacebookRequest];
            }
        }];
    }

    - (void)processFacebookRequest {
        FBRequest *request = [FBRequest requestForMe];
        // Send request to Facebook
        [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
            if (!error) {
                // result is a dictionary with the user's Facebook data
                NSDictionary *userData = (NSDictionary *)result;
                NSString * email = [result objectForKey:@"email"];

                NSString *facebookID = userData[@"id"];
                NSLog(@"facebookID = %@", facebookID);

            } else {
                NSLog(@"error : %@", error.localizedDescription);
            }
        }];
    }