0

我已将 facebook 集成到我的 ios 应用程序中,并且运行良好。但是当我将我的 FB 凭据存储在设置中时,它不起作用。它进入以下状态

    - (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            NSLog(@"case open session");
            // if([sharePref returnFbName].length==0)
            [self listFriendsFB];
            break;
        case FBSessionStateClosed:
            NSLog(@"case FBSessionStateClosed session");
        case FBSessionStateClosedLoginFailed:
            // Once the user has logged in, we want them to
            // be looking at the root view.
            //[viewController popToRootViewControllerAnimated:NO];
            [FBSession.activeSession closeAndClearTokenInformation];
            NSLog(@"case close or fail session");
            break;
        default:
            break;
    }

它进入FBSessionStateClosedLoginFailed,并发生错误。如果我从手机设置中删除我的帐户,它工作正常,即会话打开并且正确登录。这是我的代码

- (void)openSession
{
    //[self syncFacebookAccount];
    NSArray *permissions=[[NSArray alloc]initWithObjects:@"email,publish_actions",nil];
    dispatch_async(dispatch_get_main_queue(), ^{

    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"fb open session");
         [self sessionStateChanged:session state:state error:error];
     }];
    });

}

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            NSLog(@"case open session");
            // if([sharePref returnFbName].length==0)
            [self fourthViewInitialization];
            [self getFacebookInfo];
            break;
        case FBSessionStateClosed:
            NSLog(@"case FBSessionStateClosed session");
        case FBSessionStateClosedLoginFailed:
            // Once the user has logged in, we want them to
            // be looking at the root view.
            //[viewController popToRootViewControllerAnimated:NO];
            [FBSession.activeSession closeAndClearTokenInformation];
            NSLog(@"case close or fail session");

            break;
        default:
            break;
    }

    if (error) {
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:AlertTitle
                                  message:@"We are currently facing facebook connectivity issues. Please try again later!"
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        NSLog(@"error facebook : %@",error);
        [alertView show];
        [self hideActivityIndicator];
    }
}


#pragma facebook methods
-(void)getFacebookInfo
{
    //    [NSThread detachNewThreadSelector:@selector(startLoader) toTarget:self withObject:nil];
    NSString *query =[NSString stringWithFormat:@"Select name,uid,pic_square from user where uid=me()"];
    // Set up the query parameter
    my_info=[[NSMutableDictionary alloc]init];
    my_info_array=[[NSMutableArray alloc ]init];
    NSDictionary *queryParam =
    [NSDictionary dictionaryWithObjectsAndKeys:query, @"q", nil];
    // Make the API request that uses FQL
    [FBRequestConnection startWithGraphPath:@"/fql"
                                 parameters:queryParam
                                 HTTPMethod:@"GET"
                          completionHandler:^(FBRequestConnection *connection,
                                              id result,
                                              NSError *error) {
                              if (error) {
                                  NSLog(@"Error: %@", [error localizedDescription]);
                                  [self hideActivityIndicator];
                              } else {
                                  // NSLog(@"Result: %@", result);
                                  //   [self hideActivityIndicator];


                                  my_info_array=(NSMutableArray *)[result objectForKey:@"data"];
                                  my_info=[my_info_array objectAtIndex:0];
                                  //NSLog(@"my info array %@",my_info_array);
                                  NSLog(@"my info from fb %@",my_info);
                                  //return my_info;
                                  [firstView removeFromSuperview];
                                  [self.view addSubview:fourthView];
                                  displayNameLabel.text=[NSString stringWithFormat:@"%@%@",displayNameLabel.text,[my_info objectForKey:@"name"]];
                                  [registerRequest setObject:[my_info objectForKey:@"name"] forKey:@"displayName"];
                                  //[registerRequest setObject:[my_info objectForKey:@"email"] forKey:@"emailId"];
                                  [registerRequest setObject:[my_info objectForKey:@"uid"] forKey:@"uid"];

                                  [SharedPreferenceClass setFBUID:[my_info objectForKey:@"uid"]];// 30 sept

                                  [registerRequest setObject:[my_info objectForKey:@"pic_square"] forKey:@"profilePic"];
                                  NSString* picPath = [my_info objectForKey:@"pic_square"];
                                  if (picPath.length>0) {
                                       [SharedPreferenceClass setUserProfilePictureDefault:picPath];
                                  }else{
                                      [SharedPreferenceClass setUserProfilePictureDefault:@""];
                                  }

                                  //displayName.text=[my_info objectForKey:@"name"];
                                  [self hideActivityIndicator];
                              }
                          }];
}

提前致谢。

4

1 回答 1

0

当手机设置中提供 FB 凭据时,我使用它来打开会话

 // Initialize a session object
    FBSession *session = [[FBSession alloc] init];
    // Set the active session
    [FBSession setActiveSession:session];

    [session openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView
            completionHandler:^(FBSession *session,
                                FBSessionState status,
                                NSError *error) {
                // Respond to session state changes,
                NSLog(@"fb open session %@",error);
                [self sessionStateChanged:session state:status error:error];
            }];

一旦会话打开,我就使用以下代码获取 FB 好友数据。

 NSArray *permissions=[[NSArray alloc]initWithObjects:@"email,publish_actions",nil];
    dispatch_async(dispatch_get_main_queue(), ^{

    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"fb open session");
         [self sessionStateChanged:session state:state error:error];
     }];
    });
于 2013-10-04T12:22:19.940 回答