2017-09-19 1 views
0

J'essaie de mettre en œuvre la connexion Facebook dans mon application. Je fais déjà tout ce que la page de développeur de Facebook me recommande mais je ne peux pas faire ce travail correctement.FBSDKLogin ne fonctionne pas correctement rediriger vers Safari, mais le résultat est annulé

J'ai déjà mis mon identifiant de groupe dans Facebook Dev App

Facebook Config:

Facebook Config

Xcode Projet Config:

Xcode Project Config

Dans mon AppDelegate je mets la code que Facebook indique

#import <FBSDKCoreKit/FBSDKCoreKit.h> 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
     { 

      [[FBSDKApplicationDelegate sharedInstance] application:application 
            didFinishLaunchingWithOptions:launchOptions]; 


      return YES; 
     } 

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

     BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application 
                    openURL:url 
                  sourceApplication: sourceApplication 
                   annotation: annotation 
         ]; 

     return handled; 
    } 

    - (void)applicationDidBecomeActive:(UIApplication *)application 
    { 
     [FBSDKAppEvents activateApp]; 
    } 

mettre également le bouton de connexion comme indiqué dans la documentation Facebook

-(void) viewDidLoad() { 
    self.loginButton = [[FBSDKLoginButton alloc] init]; 
    self.loginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"]; 
    [self.loginButton addTarget:self action:@selector(buttonFacebookLoginClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    self.manager =[[FBSDKLoginManager alloc] init]; 
} 

Mais dans la méthode buttonFacebookLoginClicked quand je manipule la réponse que je l'ai toujours result.isCancelled comme vrai.

Dans l'application lorsque je clique sur le bouton de connexion FB, je suis redirigé vers un nouvel onglet de safari qui ne montre rien, puis lorsque je clique sur le bouton OK, le résultat est annulé.

Mon bouton de connexion Facebook:

My Facebook login button

vue Safari:

Safari view

Il est ma fonction de connexion, et je laisse tomber toujours dans le cas où result.isCancelled est vrai, après cliquez sur le bouton OK dans Safari

- (IBAction)buttonFacebookLoginClicked:(id)sender { 

    if ([FBSDKAccessToken currentAccessToken] != nil) { 
    [self.manager logOut]; 
    //return 
    } 

    [self.manager logInWithReadPermissions: self.loginButton.readPermissions fromViewController: self handler: ^(FBSDKLoginManagerLoginResult* result, NSError* error) { 
    if (error != nil) { 
     //According to Facebook: 
     //Errors will rarely occur in the typical login flow because the login dialog 
     //presented by Facebook via single sign on will guide the users to resolve any errors. 

     // Process error 
     [self.manager logOut]; 
    } else if (result.isCancelled) { 
     // Handle cancellations 
     for (NSString * p in self.loginButton.readPermissions) { 
     NSLog(@"PERMISSION %@", p); 
     } 
     [self.manager logOut]; 
    } else { 
     // If you ask for multiple permissions at once, you 
     // should check if specific permissions missing 
     BOOL allPermsGranted = true; 

     //result.grantedPermissions returns an array of _NSCFString pointers 
     NSArray *grantedPermissions = [[result grantedPermissions] allObjects]; 

//  let grantedPermissions = result.grantedPermissions.allObjects.map({"\($0)"}) 

     for (NSString *permission in self.loginButton.readPermissions) { 
     for (NSString* grantedPerm in grantedPermissions) { 
      NSRange range = [permission rangeOfString:grantedPerm]; 
      if (range.length == 0) { 
      allPermsGranted = false; 
      break; 
      } 
     } 
     } 
     if (allPermsGranted) { 
     // Do work 
     NSString * fbToken = [[result token] tokenString]; 
     NSString * fbUserID = [[result token] userID]; 

     FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] 
             initWithGraphPath:@"/me" 
             parameters:@{@"fields": @"id,name,email"} 
             HTTPMethod:@"GET"]; 

     [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
      NSLog(@"result %@", result); 
      NSDictionary *dict = @{ 
           @"email" : @"email" , 
           @"providerID" : @"id", 
           @"username" : @"name", 
           @"provider" : @"facebook" 
           }; 
      NSLog(@"DICT %@", dict); 
      [self.delegate loginWithCredentials:dict]; 
      [self logUserLoggedInWithFacebookEvent]; 
     }]; 

     } else { 
     //The user did not grant all permissions requested 
     //Discover which permissions are granted 
     //and if you can live without the declined ones 
     NSLog(@"FACEBOOK LOGIN ERROR"); 
     } 
    } 


    }]; 

} 

Je pense que c'est une erreur moins mais je ne peux pas le trouver.

+1

Puis-je demander, pourquoi ne pas utiliser le cadre de compte comme une meilleure option? Une question de plus si vous voulez aller avec FB SDK, avez-vous configuré votre. PLIST pour facebook sdk? –

+0

Il vous manque cette partie https: //developers.facebook.com/docs/ios/getting-started/#xcode \ –

+0

Je l'ai déjà fait dans mon fichier .plist @Gagan_iOS – origds

Répondre

0

pouvez-vous s'il vous plaît vérifier la section «capacités» des paramètres de la cible? Activez l'option "Partage de trousseau". Comme FBSDK utilise le trousseau pour stocker le jeton d'accès.

+0

Oui l'option de partage de trousseau est activée mais ne fonctionne toujours pas @Swap – origds

0

Il me semble que nous pourrions manquer les informations sur les types d'URL ou d'autres informations dans votre fichier Info.plist. Normalement, vous devez spécifier le type de schéma que votre application peut gérer en tant que rappel. Ainsi, une fois que vous vous êtes connecté, Safari rappelle votre application avec les informations correctes.

EDIT: les données obfusquées sont une chaîne comme fb<number> dans mon cas. Normalement apparaît quelque part comme "URL de redirection" dans d'autres fournisseurs OAUTH.

enter image description here

+0

Merci, mais j'ai déjà défini les types d'URL – origds

+0

Très bien! Je ne les ai pas vus dans votre question. D'autres problèmes peuvent être liés à des environnements de construction différents (débogage, release, stage ...). Info.plists peut être différent pour chacun. Bonne chance. Postez votre réponse si vous la finissez! – jsdario