web-dev-qa-db-fra.com

La connexion Facebook native a cessé de fonctionner après la mise à jour du SDK vers la version 3.14

Update: le comportement semble avoir changé. Je ne reçois plus le message d'erreur, mais la connexion native ne fonctionne toujours pas. Au lieu de cela, je suis redirigé vers la boîte de dialogue Web si l'application Facebook n'est pas installée. Facebook a-t-il supprimé la prise en charge de la connexion native pour le dernier SDK? Les autorisations que j'ai demandées étaient "profil public", "email" et "user_likes". J'ai également essayé de supprimer l'autorisation "user_likes", car elle ne fait pas partie des autorisations de base, comme indiqué ici: https://developers.facebook.com/docs/ios/ui-controls#iosintegration la boîte de dialogue de connexion native n'apparaît pas!

J'ai récemment mis à jour mon projet iOS pour utiliser la version 3.14.0 du SDK de Facebook (mise à niveau à partir de la version 3.13.0 via CocoaPods). J'ai lu les notes de mise à niveau et changé l'autorisation "basic_info" en "public_profile" comme recommandé.

Si j'appelle maintenant

FBSession openActiveSessionWithReadPermissions:
                                   allowLoginUI:
                              completionHandler:

cela ne fonctionne que via le web ou la connexion à l'application Facebook. Si je me connecte nativement dans les paramètres du système d'exploitation, la connexion échoue avec

Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)"

Quelqu'un at-il rencontré des problèmes similaires? La connexion native ne fonctionne-t-elle plus de cette façon? Ou est-ce un problème avec les autorisations "modifiées"?

Cordialement K

26
Alf

J'ai juste couru à ce problème aussi, voici les détails sur ce qui s'est passé et comment j'ai corrigé mon application.

Ligne de fond
En raison du nouveau processus de connexion dans lequel les utilisateurs peuvent maintenant approuver/refuser chaque autorisation demandée (quelque chose qui n'est pas pris en charge par la connexion intégrée à ios natif), Facebook a modifié le comportement de connexion par défaut du SDK pour essayer d'abord le commutateur d'application rapide de Facebook, puis retour sur la vue Web, en ignorant complètement les informations d’identification Facebook au niveau du système ios.

Ceci est noté dans le guide de mise à niveau (formulaire 3.13> 3.14) ici: https://developers.facebook.com/docs/ios/upgrading

Partie pertinente:
"Le comportement de connexion par défaut a changé de FBSessionLoginBehaviorUseSystemAccountIfPresent à FBSessionLoginBehaviorWithFallbackToWebView."

Alors que faire?
Eh bien, si vous n'avez besoin d'aucune des nouvelles choses, FBLikeControl etc ..., introduites dans la version 3.14, vous pouvez simplement revenir à la version 3.13. Toutefois, si vous souhaitez/devez utiliser 3.14n, il existe une méthode d'instance sur FBSession qui prend FBSessionLoginBehavior en tant que paramètre: https://developers.facebook.com/docs/reference/ios/current/class/FBSession/# openWithBehavior: completionHandler :

J'ai mis à jour le corps de ma méthode d'ouverture d'une session Facebook à partir de: 

 [FBSession openActiveSessionWithReadPermissions: @ [@ "email", @ "user_location"] 
 allowLoginUI: OUI 
 completionHandler: 
 ^ (Session FBSession *, état FBSessionState, erreur NSError *) {
 [self sessionStateChanged: état de la session: état erroné: erreur]; 
 } 
 ]; 

à:

 FBSessionStateHandler completionHandler = ^ (session FBSession *, statut FBSessionState, erreur NSError *) {
 [self sessionStateChanged: état de la session: erreur d'état: erreur]; 
 }; 

 if ([FBSession activeSession] .state == FBSessionStateCreatedTokenLoaded) {
 // nous avons un jeton en cache, alors ouvrez la session 
 [[FBSession activeSession] openWithBehavior: FBSessionLoginBehaviorUseSystemAccountIfPresent 
 completionHandler: completionHandler]; 
 } autre {
 [self clearAllUserInfo]; 
 // crée une nouvelle session facebook 
 FBSession * fbSession = [[FBSession alloc] initWithPermissions: @ [@ "email", @ "user_location"]]; 
 [FBSession setActiveSession: fbSession]; 
 [fbSession openWithBehavior: FBSessionLoginBehaviorUseSystemAccountIfPresent 
 completionHandler: completionHandler]; 
 } 

NOTE: ma méthode clearAllUserInfo comprend les lignes suivantes:

 [FBSession.activeSession closeAndClearTokenInformation]; 
 [FBSession renewSystemCredentials: ^ (résultat ACAccountCredentialRenewResult, erreur NSError *) {
 NSLog (@ "% @", erreur); 
 }]; 
 [FBSession setActiveSession: nil]; 

Il est également intéressant de consulter la documentation de Facebook sur les sessions de compréhension: http://developers.facebook.com/docs/facebook-login/ios/v2.0#sessions

56
ryandowning

Vérifiez les autorisations que vous avez demandées. Dans le nouveau SDK (3.14), l'autorisation basic_info est obsolète et vous devez soumettre l'application à la révision des autorisations étendues. Les autorisations de base sont: public_profile, email et user_friends

Plus d'infos ici: https://developers.facebook.com/docs/ios/upgrading

3
Richard Chirino

Peut-être que vous manquez peut-être cette méthode:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

Cela a aidé mon cas dans lequel je devais migrer de la version 3.9.0 à la dernière. J'espère que ça aide.

0
Giancarlo

si vous utilisez Facebook SDK 4.0, vous pouvez définir un comportement de connexion. La valeur par défaut est FBSDKLoginBehaviorNative, mais vous pouvez la définir sur FBSDKLoginBehaviorSystemAccount.

Voir le code ci-dessous:

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
login.loginBehavior = FBSDKLoginBehaviorSystemAccount;
[loginManager logInWithReadPermissions:@[@"email"]
                    fromViewController:self
                               handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
  //TODO: process error or result
 }];
0
Joey

J'ai rencontré ce problème aussi. Une solution rapide consiste simplement à demander à l'utilisateur de supprimer ses identifiants Facebook iOS, de se connecter avec votre application, puis de les réintégrer.

0
valheru