Je suis nouveau dans le développement d'applications IOS et c'est la première fois que j'intègre le SDK Facebook dans une application. J'utilise mon contrôleur de vue initial pour authentifier l'utilisateur via le SDK Facebook et le rediriger vers un autre contrôleur de vue une fois qu'il est authentifié. De plus, une fois qu'il clique sur se déconnecter, je veux pouvoir rediriger l'utilisateur vers ce contrôleur de vue initial.

J'utilise le code suivant (dans la fonction viewDidLoad) pour ajouter le bouton de connexion Facebook à ma vue:

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];

Le bouton fonctionne bien, mais j'ai remarqué que juste après la connexion, le [FBSDKAccessToken currentAccessToken] est nil dans toutes les fonctions du cycle de vie du contrôleur de vue. En gros, il semble que cette valeur soit initialisée par le SDK Facebook après le chargement de ma page.

Existe-t-il un moyen d'exécuter une fonction juste après l'initialisation de ce jeton d'accès, afin que je puisse rediriger avec succès vers un autre contrôleur? ou y a-t-il une fonctionnalité qui pourrait m'aider à atteindre ce comportement? De même, j'aimerais pouvoir rediriger l'utilisateur vers ce contrôleur de vue initial une fois qu'il clique sur le bouton de déconnexion à partir d'une vue différente.

1
Radu Bucur 20 avril 2017 à 04:20

3 réponses

Meilleure réponse

J'ai trouvé que, de loin, la solution la plus simple à ce problème serait de définir View Controller en tant que délégué pour le bouton de connexion et d'implémenter les fonctions suivantes:

Tout d'abord, vous devez utiliser ce protocole:

@interface LoginController ()<FBSDKLoginButtonDelegate>

Ensuite, définissez le contrôleur de vue comme délégué du bouton

loginButton.delegate = self;

Enfin, vous devrez vous assurer que les 2 méthodes suivantes sont implémentées

- (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 
}
4
Radu Bucur 20 avril 2017 à 08:25

Voici le code complet et complet pour récupérer les informations de l'utilisateur.

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);
                  }
              }];
         }
     }
 }];
0
Pang 9 oct. 2017 à 06:59

Je pense que vous devez utiliser FBGraphApi qui vous rappellera lorsque l'utilisateur se connectera avec succès.

Essayez le code ci-dessous:

-(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);
                      }];
                 }
             }];

}

En appelant la fonction ci-dessus, vous serez rappelé dans ComplitionBlock.

0
Govind Prajapati 20 avril 2017 à 04:03