Facebook SDK Objective-C 登录后触发事件

Posted

技术标签:

【中文标题】Facebook SDK Objective-C 登录后触发事件【英文标题】:Facebook SDK Objective-C trigger event after login 【发布时间】:2017-04-20 01:20:48 【问题描述】:

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

我正在使用以下代码(在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 初始化的。

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

【问题讨论】:

您需要手动管理它...您需要使用FacebookSDK的委托方法。 是的,谢谢,这就是我最终要做的。我添加了关于如何完成此操作的简要说明,因为我无法在 Facebook 开发人员页面的入门指南中找到此信息 你能告诉我你是怎么做到的吗?我面临同样的问题 【参考方案1】:

我发现,到目前为止,解决这个问题最简单的方法是将 View Controller 设置为登录按钮的委托并实现以下功能:

首先,你必须使用这个协议:

@interface LoginController ()<FBSDKLoginButtonDelegate>

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

loginButton.delegate = self;

最后,您必须确保实现以下两种方法

- (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 

【讨论】:

【参考方案2】:

我认为你必须使用 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 中得到回调。

【讨论】:

感谢您的帮助,但我认为在我的情况下使用图形 API 不是强制性的。【参考方案3】:

这是获取用户信息的完整代码。

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 =@"fbAllDataValue";

        indicators.hidden=YES;
        [indicators stopAnimating];

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

    
                      ];
                  
                  else

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

【讨论】:

以上是关于Facebook SDK Objective-C 登录后触发事件的主要内容,如果未能解决你的问题,请参考以下文章

应用程序的 Objective-C Facebook 视频共享

使用 Objective-C 和 C++ 实现 X-FACEBOOK-PLATFORM 身份验证的身份验证失败

Xcode / Objective-C Facebook 委托尝试

如何在 iOS(Objective-C)中分享到 Facebook Messenger 应用程序的链接?

Facebook iOS SDK 返回错误“com.facebook.sdk 错误 4”

Facebook SDK:在IOS7上无法完成操作(com.facebook.sdk错误2)