J'essaie d'implémenter la connexion Facebook dans mon application iOS à l'aide de Parse.
let permissionsArray = ["public_profile", "email"]
PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
{ (user: PFUser?, error: NSError?) in
if let user = user {
//we logged in!
}
else {
//login error!
}
}
Cela fonctionne bien dans le simulateur, mais pas sur le périphérique. Sur l'appareil, j'obtiens cette erreur:
Domaine d'erreur = com.facebook.sdk.login Code = 308 "L'opération n'a pas pu être terminée. (Com.facebook.sdk.login erreur 308.)
Le code d'erreur 308 est pour FBSDKLoginBadChallengeString
, "Il manquait une chaîne de challenge valide dans la réponse de connexion."
Lorsque j'autorise mon application sur Facebook, cela s'appelle:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
L'URL est:
fb1640722449492705://authorize/#state=%7B%22challenge%22%3A%225OKWv3wN%2BEH%2BeQu48Xv6ty%2BRuek%3D%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A1%2C%220_auth_logger_id%22%3A%22564CD915-2CFC-4989-9AF6-CEA389908D51%22%7D&granted_scopes=user_birthday%2Cpublic_profile&denied_scopes=&signed_request=c8SBBDeaNpF-R_XTYx4LRA0BWm5p9IwXDr8M4nL3YXI.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURhTXJibGw4Q3dITkd5M0xnQmNkVTNuYWRkeEVoTU5mMmx3eFpZU2IwZl9SU284YXhZdXZaRS02RnA2bU5Cdy1CWkVoRmt2Zk1xX1AxSHltUG00aWhkWE9hYmlvWFBiMnpCYkVnR1RRX3lzZVFIZXdHU19OcmpkNUF6WGtob1dfVE4wTmRrSGk5MzY0V2hFWUJDV0dfcE16RXpQVExHWE13X1dzb0QzZGtITm5fM0tHNjFxUjJyM3RDWVlNQTE4WENpS1dXTHUyM2dIRVhmTXc3ZTQ0M2xDQUtGRl9KSXcyVk1sS01FOTQ4dHQ2U1Fqb0tlVkp4RmJNSEFsWDZFYWxlUnQ2aGRrTGZlU2xuVTV5VjZ1bFhldHkxeEV5RmRDZVFHb2RXQ0dULVVCd3QyM0haY0dxNk8zbnE1cDRNWjNFZ012U2JhSGZyMmF6Wm8xUXk2X2xSQVNWcFlMVDZUdU5wZnMwVkJqNEdSaFEiLCJpc3N1ZWRfYXQiOjE0MzM0MTg2MDksInVzZXJfaWQiOiIxNDM3MzM0ODk5OTIwNDA5In0&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir
Oui, j'ai tout suivi dans Le guide de connexion de Parse sur Facebook (m'assure que tous les identifiants de paquet correspondent, implémente toutes les méthodes AppDelegate requises, etc.)
Qu'est-ce que cette erreur signifie exactement et comment le résolvez-vous?
Fixe le. Ce problème était dû à la connexion avec Parse et avec FBSDKLoginButton
.
Voici ce que je faisais:
//in my UI setup code:
let fbLoginButton = FBSDKLoginButton()
fbLoginButton.addTarget(self, action: "fbButtonTouched:", forControlEvents: UIControlEvents.TouchUpInside)
....
func fbButtonTouched() {
let permissionsArray = ["public_profile", "email"]
PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
{ (user: PFUser?, error: NSError?) in
if let user = user {
//we logged in!
}
else {
//login error!
}
}
}
J'ai découvert (à la dure) que tapotant une FBSDKLoginButton
tente de connecter l'utilisateur! Il n'était pas nécessaire de connecter également l'utilisateur en utilisant PFFacebookUtils.logInInBackgroundWithReadPermissions
. Je viens donc de me débarrasser de fbButtonTouched()
et je pouvais me connecter avec joie.
Donc, ce qui s’est passé, c’est que j’essayais deux fois au même moment, ce qui a plu au simulateur, mais pas à l’appareil.
Si vous voulez savoir pourquoi, c'est parce que le défi d'authentification de connexion qu'il a reçu ne correspond pas à celui attendu parce qu'il a reçu celui de la première tentative de connexion après avoir envoyé celui du deuxième journal. tentative et attend donc la deuxième tentative de connexion des tentatives d’authentification.
La documentation de FBSDKLoginButton
ne mentionne pas pour le moment quoi que ce soit sur le fait que le fait de taper dessus lance le flux de journalisation, et parce que c'est une sous-classe de UIButton
, vous penseriez que vous devriez addTarget
et mettre en œuvre le flux de connexion vous-même. Et avoir deux connexions en même temps conduit à une variable FBSDKLoginBadChallengeString
trompeuse. Recette pour un désastre...
EDIT: La documentation a été mise à jour en conséquence:
FBSDKLoginButton
fonctionne avec[FBSDKAccessToken currentAccessToken]
pour déterminer ce qu’il faut afficher, et démarre automatiquement l’authentification lorsque vous appuyez dessus (c’est-à-dire que vous n'avez pas besoin de souscrire manuellement des cibles d'action).
(mon emphase)
J'ai suivi la solution de contournement de totvos et cela fonctionne aussi pour moi lorsque j'utilise FBSDKLoginKit 4.7.1 & FBSDKCoreKit 4.8:
Solution de contournement ... créez l'application et copiez-la sur le téléphone, puis démarrez l'application de l'appareil (pas le débogueur). Ensuite, attachez le débogueur au processus en cours. Cela semble résoudre tout problème de timing est cassé cela, et les différentes opérations de trousseau semblent fonctionner correctement lors du débogage.
Référence: https://forums.developer.Apple.com/thread/4743#85335
Mettre à jour:
Cette solution de contournement ne fonctionnant pas tout le temps, j'ai donc utilisé la réponse de @ coco ci-dessus: https://stackoverflow.com/a/31480026/877225
Je n'ai vu cette erreur que lorsque je me suis déconnecté, puis reconnecté.
Mon code de connexion et mon code de déconnexion se trouvaient dans des fichiers différents, car l'interface utilisateur appropriée pour la connexion et la déconnexion étaient totalement différentes et j'avais instancié deux instances distinctes de FBSDKLoginManager. La consolidation en un seul cas a résolu le problème pour moi.
Apparemment, la seule solution qui a fonctionné pour moi consiste à ajouter le droit de partage du trousseau à la cible.
Vous pouvez le trouver dans Project_name-> target_name-> Capabilities-> Keychain Sharing
J'ai trouvé ce problème lorsque je suis passé à:
FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.
Il est parti quand j'ai rétrogradé à:
FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0
Je n'ai pas encore eu l'occasion de découvrir à quel point les mises à niveau en sont la cause - par exemple, pourrais-je rester bloqué avec 4.3.0 pour les trois?
Essayez d’exécuter votre application directement à partir de votre appareil sans avoir à la lancer depuis votre Xcode. Puis connectez-vous à Facebook sans être dérangé par 308. Après cela, vous pourrez reprendre le lancement à partir du Xcode sur votre appareil sans le même problème.
Cela semble être un problème entre le SDK FB et iOS et non lié à Parse. J'apprécierais que quelqu'un puisse nous éclairer sur ce sujet.
La version de mon Xcode est 7.1, FB SDK est 4.8.x.
J'utilise
pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'
... et avait le problème code 308
lorsque je me suis déconnecté et que je me suis connecté au cours de la même session. Utiliser [[FBSDKLoginManager alloc] logOut]
ou [facebookLoginManager logOut]
(avec un gestionnaire persistant) juste avant d'appeler logInWithReadPermissions:
ne fonctionnait pas, mais l'ajout de
[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];
avant que l'appel logInWithReadPermissions:
fonctionne correctement. (Testé sous iOS 9.2.)
Avant de rétrograder, j'essayais de vider le cache local. J'ai eu ce problème lors du basculement entre les comptes Facebook. Supprimez votre application, forcez Facebook à quitter, puis relancez le tout et voyez s'il persiste. Il se peut qu’un bogue se produise lorsque Facebook transmet une ancienne clé en cache qui n’est plus valide. Le déclassement peut être vider le cache ou l'ancienne version n'a pas le bogue.
si vous vous déconnectez et vous reconnectez sans quitter cette application, cette erreur aussi viens,
let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
println("the delete permission is \(result)")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
FBSDKAccessToken.setCurrentAccessToken(nil)
FBSDKProfile.setCurrentProfile(nil)
fbLoginManager.logOut()
AppDelegate.sharedAppDelegte().logout()
})
})
J'ai également eu l'erreur 308, cependant je n'utilisais pas le SDK Parse.
Ces erreurs ont commencé à apparaître lorsque j'ai mis à niveau le SDK Facebook iOS à partir de la version 4.0.1
(FacebookSDKs-iOS-20150402
) vers l'une des versions les plus récentes (4.2.0
- FacebookSDKs-iOS-20150528
ou 4.3.0
- FacebookSDKs-iOS-20150625
).
La mise à niveau du Facebook iOS SDK vers la version 4.0.1
a résolu ce problème pour moi.
Notons que les nouvelles versions du SDK semblent bien corrélées avec l’apparition de 308 messages d’erreur sur SO au début du mois de juin.
Suivez ces étapes pour résoudre ce type d'erreur:
En utilisant PFFacebookUtils 1.9.0 et FBSDKLoginKit 4.7.0 M’est arrivé après la déconnexion et la connexion (sans redémarrer l’application) Solution - Objectif C: .__, ajoutez simplement [[PFFacebookUtils facebookLoginManager] logOut];
Avant [PFFacebookUtils logInInBackgroundWithReadPermissions
Utilisez la même instance FBSDKLoginManager jusqu'à la déconnexion, ALORS créez une nouvelle instance.
[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];
Réponse officielle de Facebook:
Nous suivons déjà ce problème dans un autre rapport de bogue, et il semble que être une erreur du côté d'Apple.
Vous n'avez pas à déclasser pour cela.
Effectuez les opérations suivantes et cela devrait fonctionner: - Nettoyez vos données dérivées (Xcode -> Préférences -> Emplacements -> Cliquez sur la petite flèche en regard de Données dérivées). Assurez-vous de lire à propos des données dérivées avant de procéder. Si vous avez un projet compliqué et que vous avez commis des erreurs stupides (ex: certains fichiers ont été supprimés), vous devrez peut-être résoudre le problème avant de relancer votre application. Mais ce ne sera pas si difficile .- Supprimer votre application de votre appareil/simulateur - Supprimer l'approbation de votre application Facebook de Facebook (Réglage -> Application -> Cliquez sur le "x" pour supprimer votre application)
Relancez l'application et tout devrait fonctionner.
Bonne chance!
Je résous le problème avec:
Cela est dû au problème authenticationChallenge lorsque vous essayez par erreur de vous connecter deux fois simultanément, puis que des connexions supplémentaires vous donneront un avertissement de trousseau sur la console lors du débogage. Sans le mode de débogage, vous n'obtiendrez pas cette erreur, la raison en est que le trousseau fonctionnera correctement si vous n'êtes pas en train de déboguer.
Il existe peu de solutions de contournement pour cela: 1. Essayez de vous connecter sans mode de débogage et une fois que vous avez réussi, vous pouvez également vous connecter avec succès en mode de débogage . 2. Recherchez le code d'erreur FBSDKLoginBadChallengeString et appelez [FBSDKAccessToken setCurrentAccessToken:nil]
pour effacer le jeton et reconnectez-vous.
Le code d'erreur 308 est FBSDKLoginBadChallengeString
L'utilisation d'une instance partagée pour FBSDKLoginManager résout le problème. J'ai créé un singleton qui garantit que seul un FBSDKLoginManager est instancié.
Je suppose que cela a à voir avec le login iOS9 Safari, mais pas à 100% si
J'ai eu le même problème quand j'essayais d'attraper un événement de connexion et de déconnexion comme ci-dessous
loginButton = [[FBSDKLoginButton alloc] init];
// Handle clicks on the button
[loginButton
addTarget:self
action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];
// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login
logInWithReadPermissions: @[@"public_profile"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
NSLog(@"Process error");
} else if (result.isCancelled) {
NSLog(@"Cancelled");
} else {
NSLog(@"Logged in");
}
}];
}
Mais ceci n’est utile que pour un bouton de connexion personnalisé; si vous utilisez le bouton de connexion par défaut du fb, le FBSDKLoginManager a déjà été initialisé, vous obtiendrez l’erreur en essayant de créer un autre.
Donc, afin de saisir les événements de connexion et de déconnexion, il suffit de définir le bouton Déléguer pour la connexion, puis de le gérer comme suit:
loginButton = [[FBSDKLoginButton alloc] init];
loginButton.delegate = self;
- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
if (!error) {
[self getFBProfile];
}
}
- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
[self logout];
}
Mettre à jour Facebook SDK à la dernière version a résolu ce problème.