2017-04-20 50 views
0

我是IOS应用程序开发新手,这是我第一次将Facebook SDK集成到应用程序中。 我使用我的初始视图控制器通过Facebook SDK对用户进行身份验证,并在身份验证后将其重定向到另一个视图控制器。另外,一旦他点击注销,我希望能够将用户重定向回该初始视图控制器。登录后Facebook SDK Objective-C触发事件

我用下面的代码(viewDidLoad函数内),以Facebook登录按钮添加到我的观点:

FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init]; 

// setting the facebook button position 
float screenHeight = [[UIScreen mainScreen] bounds].size.height; 
float screenWidth = [[UIScreen mainScreen] bounds].size.width; 
CGPoint origin = CGPointMake(screenWidth/2, screenHeight - 100); 

// Optional: Place the button in the center of your view. 
loginButton.center = origin; 
[self.view addSubview:loginButton]; 

按钮工作正常,但我注意到,之后我登录时,所有视图控制器生命周期函数中的[FBSDKAccessToken currentAccessToken]nil。基本上,我的页面加载后,似乎这个值由Facebook SDK初始化。

有没有什么办法可以在访问令牌被初始化后执行一个函数,以便我可以成功地重定向到不同的控制器?或者是否有任何功能可以帮助我实现这种行为? 同样,我希望能够将用户重定向到这个初始视图控制器,一旦他从不同的视图点击注销按钮。

+0

你需要手动管理它......你需要使用FacebookSDK的委托方法。 – KKRocks

+0

是的,谢谢,这就是我最终做的。我添加了一个简单的解释,说明如何完成这项工作,因为我没有能够在Facebook开发者页面 –

回答

1

我发现,到目前为止,这个问题最简单的办法是设置视图控制器作为登录按钮的代表,并实现以下功能:

首先,你必须使用此协议:

@interface LoginController()<FBSDKLoginButtonDelegate> 

然后,设置视图控制器作为按钮的委托

loginButton.delegate = self; 

最后,你必须确保实施以下2种方法

- (void) loginButton:(FBSDKLoginButton *)loginButton 
didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result 
       error:(NSError *)error{ 
    //use your custom code here 
    //redirect after successful login 
} 
- (void) loginButtonDidLogOut:(FBSDKLoginButton *)loginButton{ 
    //use your custom code here 
    //redirect after successful logout 
} 
0

我想你必须使用FBGraphApi,它会在用户登录成功时给你回电。

试试下面的代码:

-(void)FBLoginWithViewController:(UIViewController *)viewController withCompletion:(FBDataBlock)block 
{ 
    [login logInWithReadPermissions: @[@"public_profile"] 
      fromViewController:viewController 
      handler:^(FBSDKLoginManagerLoginResult *permissionResult, NSError *error) { 
       if (error) { 

        block(permissionResult,error,nil); 

       } else if (permissionResult.isCancelled) { 

        block(permissionResult,error,nil); 

       } else { 

        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{ @"fields" : @"id,name,picture,email,friends"}] 
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id response, NSError *error) { 

           block(permissionResult,error,response); 
         }]; 
       } 
      }]; 

} 

通过调用上面的函数,你会得到回电ComplitionBlock。

+0

的入门指南中找到这些信息,感谢您的帮助,但我不认为使用图形API在我的情况下是强制性的。 –

0

以下是获取用户信息的完整且完整的代码。

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
[login 
logInWithReadPermissions: @[@"public_profile", @"user_friends", @"email"] 
fromViewController:self 
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
    if (error) { 
     DLog(@"Process error======%@",error.description); 
     indicators.hidden=YES; 
     [indicators stopAnimating]; 
    } else if (result.isCancelled) { 
     DLog(@"Cancelled"); 
     indicators.hidden=YES; 
     [indicators stopAnimating]; 
    } else { 

     if ([FBSDKAccessToken currentAccessToken]) { 



      [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, link, first_name, last_name, picture.type(large), email, birthday, bio ,location ,friends ,hometown , gender ,friendlists"}] 
       startWithCompletionHandler:^(
              FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
        if (!error) 
        { 

         // NSLog(@"fetched user:%@", result); 

         // [self fetchingFacebookFriends]; 

         [defFacebookData setObject:[result objectForKey:@"email"] forKey:@"fbEmail"]; 

         [defFacebookData setObject:[result objectForKey:@"id"] forKey:@"fbID"]; 


         //PASS ID 
         getFbid = [result objectForKey:@"id"]; 
    NSLog(@"getFbid========>%@",getFbid); 

         //PASS FIRST NAME 
         getFbFirstName=[result objectForKey:@"first_name"]; 

    NSLog(@"first======>%@",getFbFirstName); 

         //PASS LAST NAME 
         getFBlastName=[result objectForKey:@"last_name"]; 
    NSLog(@"first======>%@",getFBlastName); 

         //PASS EMAIL 
         getFbemail=[result objectForKey:@"email"]; 
    NSLog(@"first======>%@",getFbemail); 

         //PASS PHONE 
         getfbGender=[result objectForKey:@"gender"]; 
    NSLog(@"first======>%@",getfbGender); 


         [defFacebookData setObject:[result objectForKey:@"name"] forKey:@"fbName"]; 

         // Image 
         FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] 
                initWithGraphPath:[NSString stringWithFormat:@"me/picture?type=large&redirect=false"] 
                parameters:nil 
                HTTPMethod:@"GET"]; 
         [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, 
                  id fbImageResult, 
                  NSError *error) { 

NSString *strURL = [NSString stringWithFormat:@"%@",[[fbImageResult objectForKey:@"data"] objectForKey:@"url"]]; 

    NSLog(@"strURL=====>%@",strURL); 

[defFacebookData setObject:strURL forKey:@"fbImage"]; 

          [defFacebookData synchronize]; 


          NSDictionary *fbdict=[NSDictionary dictionaryWithObjectsAndKeys:getFbid,@"id",getFbFirstName,@"first_name",getFBlastName,@"last_name",getFbemail,@"email",getfbGender,@"gender",strURL,@"fbImage", nil]; 

          NSLog(@"done=========>%@",fbdict); 

    UIStoryboard*storyboard=[AppDelegate storyBoardType]; 

    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults]; 


    BOOL fblogin =[defaults boolForKey:@"KeyEditProfile"]; 

     if (fblogin) 
      { 

       UIStoryboard*Storyboard=[AppDelegate storyBoardType]; 
       DashboardVC* tabbarController = (DashboardVC*)[Storyboard instantiateViewControllerWithIdentifier:@"DashboardVCId"]; 



       indicators.hidden=YES; 
       [indicators stopAnimating]; 

       [self.navigationController pushViewController:tabbarController animated:YES]; 

     } 

    else 
    { 
    EditFBVC *cpvc=(EditFBVC*)[storyboard instantiateViewControllerWithIdentifier:@"EditFBVCId"]; 
    NSLog(@"get fb id ===%@",getFbid); 


    cpvc.dictFacebookdict =fbdict; 

    cpvc.strFBlogin [email protected]"fbAllDataValue"; 

     indicators.hidden=YES; 
     [indicators stopAnimating]; 

    [self.navigationController pushViewController:cpvc animated:YES]; 

    } 
         }]; 
        } 
        else{ 

         DLog(@"error is %@", error.description); 
        } 
       }]; 
     } 
    } 
}];