ios facebook swift swift2 facebook-ios-sdk

ios - ¿Por qué recibo el error com.facebook.sdk.login 308?



share facebook swift (4)

Estoy usando Xcode 7.0, probando en iOS 9.0.2 y usando Facebook SDK 4.7.0.

Cuando inicio sesión en un usuario, la mayoría de las veces todo funciona como debería; sin embargo, a veces sigo recibiendo este error y no tengo idea de por qué.

La operación no pudo ser completada. (com.facebook.sdk.login error 308.)

Después de investigar, he visto que algunas personas reciben el error al iniciar sesión con FBUtils de FBUtils y el FBSDK oficial al mismo tiempo, sin embargo, solo estoy usando FBSDK en mi proyecto.

Entonces mi pregunta es, ¿por qué estoy obteniendo este error y cómo me deshago de él?

Editar - Agregar código

Aquí está mi lógica de inicio de sesión:

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) } } } }


Encontré la solución a este problema. Estaba creando una instancia del administrador de inicio de sesión donde lo necesitaba:

let loginManager = FBSDKLoginManager()

Luego lo estaba usando para iniciar sesión y estaba creando otra instancia en mi método de cierre de sesión. Solucioné el problema creando una variable diferida para usar en toda la aplicación:

lazy var fbLoginManager: FBSDKLoginManager = { return FBSDKLoginManager() }()

ACTUALIZAR

Facebook conoce el error y lo está investigando. Descubrí que mi solución no siempre funciona y he actualizado mi código a lo siguiente y no lo he visto desde entonces:

private var _fbLoginManager: FBSDKLoginManager? var fbLoginManager: FBSDKLoginManager { get { if _fbLoginManager == nil { _fbLoginManager = FBSDKLoginManager() } return _fbLoginManager! } }

Al cerrar sesión en Facebook, debe llamar a _fbLoginManager = nil y la instancia se volverá a crear cuando se use para iniciar sesión la próxima vez. El problema parece ocurrir más a menudo cuando se utiliza la misma instancia para volver a iniciar sesión después de cerrar la sesión pero el problema ocurre aún más cuando hay varias instancias de FBSDKLoginManager por lo que declararlo como se indicó anteriormente parece haber solucionado el problema.


Para Xcode8 - iOS10 ,

Habilitar Compartir Llaves dentro de la pestaña Capacidades del objetivo solucionó mi problema.

Más detalles se pueden encontrar aquí: https://github.com/facebook/facebook-sdk-swift/issues/51

Para Xamarin Studio (Sugerido por @Kenneth),

Agregue el archivo Entitlements.plist a Autorizaciones personalizadas en las opciones de iOS Bundle Signing en el proyecto de iOS.



También tuve este error, la razón fue en mi caso: AuthentificationController en el que estaba el botón de inicio de sesión de Facebook se presentó sin el controlador de navegación. Para resolver este error, agregué el controlador de navegación y senté AuthentificationController como root.