简体   繁体   中英

Facebook SDK login issue on iPhone

I am trying to integrate the Facebook SDK into my application, and it works in my simulator perfectly. When I install it onto my iPhone and try running it, it shows me an alert, which states, "myapp needs to access your profile, friendlist, etc", and when I choose to allow it nothing happens - and it requires these permissions.

I have installed the Facebook application on my iPhone, tried logging out and back in many times, but without use.

But, when I go to settings and delete the Facebook details, it works perfectly:

在此处输入图片说明

How can I fix this?

I used following way its working for me :

-(void)openFacebookAuthentication
{
    NSArray *permission = [NSArray arrayWithObjects:kFBEmailPermission,kFBUserPhotosPermission, nil];

    FBSession *session = [[FBSession alloc] initWithPermissions:permission];

    [FBSession setActiveSession: [[FBSession alloc] initWithPermissions:permission] ];

    [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorForcingWebView completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {

        switch (status) {
            case FBSessionStateOpen:
                [self getMyData];
                break;
            case FBSessionStateClosedLoginFailed: {
                // prefer to keep decls near to their use
                // unpack the error code and reason in order to compute cancel bool
                NSString *errorCode = [[error userInfo] objectForKey:FBErrorLoginFailedOriginalErrorCode];
                NSString *errorReason = [[error userInfo] objectForKey:FBErrorLoginFailedReason];
                BOOL userDidCancel = !errorCode && (!errorReason || [errorReason isEqualToString:FBErrorLoginFailedReasonInlineCancelledValue]);


                if(error.code == 2 && ![errorReason isEqualToString:@"com.facebook.sdk:UserLoginCancelled"]) {
                    UIAlertView *errorMessage = [[UIAlertView alloc] initWithTitle:kFBAlertTitle
                                                                           message:kFBAuthenticationErrorMessage
                                                                           delegate:nil
                                                                           cancelButtonTitle:kOk
                                                                           otherButtonTitles:nil];
                    [errorMessage performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
                    errorMessage = nil;
                    }
                }
                break;
                // presently extension, log-out and invalidation are being implemented in the Facebook class
            default:
                break; // so we do nothing in response to those state transitions
        }
    }];
    permission = nil;
}

Remember to add your app to facebook developers/apps!!

If not, you can't interact with their servers...

Ok, I know what is going wrong. let me know that whatever you are doing is right but the result that you want will require something else.

Try this -

First of all implement all the facebook sdk delegate methods in your app delegate.

- (IBAction)loginWithFacebookButtonTapped:(id)sender
{
    IntubeAppDelegate *delegat = (IntubeAppDelegate*)[[UIApplication sharedApplication] delegate];
    [delegat doLoginAndSwitch];
}

Now, in your appDelegate -

-(void) doLoginAndSwitch
{      
    [self openSessionWithAllowLoginUI:YES];
}

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
    NSArray *permissions = [NSArray arrayWithObjects:@"email", nil]; 
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                          defaultAudience:FBSessionDefaultAudienceFriends
                                             allowLoginUI:YES
                                        completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                            [self sessionStateChanged:session
                                                                state:state
                                                                error:error];

                                        }];
}

-(BOOL)openSessionWithAllowPublishStreamPermission:(BOOL)allowLoginUI
{
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions",@"publish_stream", nil];

    [[FBSession activeSession] requestNewPublishPermissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone completionHandler:^(FBSession *session, NSError *error){
}];
    return YES;
}

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState)state
                  error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if(!error)
            {
              //  NSLog(@"FBSessionStateOpen :- logged in");

                [self openSessionWithAllowPublishStreamPermission:YES];

              // Your code
            }
     }    
} 

Also to switch back to your application -

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{

    return [FBSession.activeSession handleOpenURL:url];
}

I hope you would get what you desire now. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM