J'utilise Xcode 7.0, je teste sur iOS 9.0.2 et j'utilise Facebook SDK 4.7.0.
Lorsque je me connecte à un utilisateur, la plupart du temps, tout fonctionne comme il se doit, mais parfois, je reçois toujours cette erreur et je ne sais pas pourquoi!
L'opération n'a pas pu être terminée. (erreur 308. com.facebook.sdk.login)
Après des recherches, j'ai constaté que certaines personnes rencontraient l'erreur en se connectant avec FBUtils
et FBSDK
officiels de parse.com en même temps, mais je n'utilise que FBSDK
dans mon projet.
Ma question est donc la suivante: pourquoi cette erreur me concerne-t-elle et comment m'en débarrasser?
Modifier - Ajouter du code
Voici ma logique de connexion:
func loginWithFacebook(sender: UIViewController, completion: (profile: FBSDKProfile?, token: String?, cancelled: Bool, error: String?) -> Void ) {
FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
NSNotificationCenter.defaultCenter().addObserver( sender , selector: "onProfileUpdated:", name:FBSDKProfileDidChangeNotification, object: nil)
let loginManager = FBSDKLoginManager()
loginManager.logInWithReadPermissions(["email", "public_profile"], fromViewController: sender) { (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
if error != nil {
print("ERROR")
completion(profile: nil, token: nil, cancelled: false, error: error.localizedDescription)
print(error.localizedDescription)
} else if result.isCancelled {
print("CANCELLED")
completion(profile: nil, token: nil, cancelled: true, error: nil)
} else {
print("NO ERROR")
if FBSDKProfile.currentProfile() == nil {
print("PROFILE IS NIL")
completion(profile: nil, token: result.token.tokenString, cancelled: false, error: nil)
} else {
print("PROFILE IS NOT NIL")
completion(profile: FBSDKProfile.currentProfile(), token: result.token.tokenString, cancelled: false, error: nil)
}
}
}
}
Pour Xcode8 - iOS10,
Activer Le partage du trousseau dans l'onglet Capacités de la cible a corrigé mon problème.
Plus de détails peuvent être trouvés ici: https://github.com/facebook/facebook-sdk-Swift/issues/51
Pour Xamarin Studio (suggéré par @Kenneth),
Ajoutez le fichier Entitlements.plist à Custom Entitlements sous les options iOS Bundle Signing
du projet iOS.
J'ai trouvé la solution à ce problème. Je créais une instance du gestionnaire de connexion où j'en avais besoin:
let loginManager = FBSDKLoginManager()
Ensuite, je l'utilisais pour me connecter et je créais une autre instance dans ma méthode de déconnexion. J'ai résolu le problème en créant une variable paresseuse à utiliser dans toute l'application:
lazy var fbLoginManager: FBSDKLoginManager = {
return FBSDKLoginManager()
}()
METTRE À JOUR
Facebook est conscient du bogue et s’y penche. J'ai constaté que ma solution ne fonctionnait pas toujours et j'ai mis à jour mon code comme suit et je ne l'ai pas vu depuis:
private var _fbLoginManager: FBSDKLoginManager?
var fbLoginManager: FBSDKLoginManager {
get {
if _fbLoginManager == nil {
_fbLoginManager = FBSDKLoginManager()
}
return _fbLoginManager!
}
}
Lorsque vous vous déconnectez de Facebook, vous devez appeler _fbLoginManager = nil
et l'instance sera recréée lors de la prochaine connexion. Le problème semble se produire plus souvent lorsque vous utilisez la même instance pour vous reconnecter après la déconnexion mais le problème se produit encore plus lorsqu'il existe plusieurs instances de FBSDKLoginManager
.
Octobre 2018.
Raison: le signe "+" est remplacé par "" dans la chaîne challengeReceived. Problème dans FBSDK.
Solution rapide et incorrecte: https://github.com/facebook/facebook-objc-sdk/pull/922
Plus précisément, remplacez la ligne 233 dans FBSDKLoginManager:
NSString *challengeExpected = [self loadExpectedChallenge];
avec
NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];
Correctif disponible dans facebook-objc-sdk
https://github.com/facebook/facebook-objc-sdk/releases/tag/sdk-version-4.38.1 et ci-dessus.
On dirait que le problème est résolu avec 4.9.0. J'ai eu le même problème et il est corrigé avec la nouvelle version du SDK .
https://developers.facebook.com/docs/ios/change-log-4.x
Assurez-vous d'être déconnecté avant d'essayer de vous reconnecter
let loginManager = LoginManager()
loginManager.logOut()
loginManager.logIn(readPermissions: [.email, .publicProfile,
J'ai également eu cette erreur la raison était dans mon cas: AuthentificationController sur lequel était le bouton de connexion Facebook a été présenté sans contrôleur de navigation . Pour résoudre cette erreur, je viens d'ajouter contrôleur de navigation et assis mon AuthenticationController en tant que root.