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.
Parece que el problema se resuelve con 4.9.0. Tuve el mismo problema y se corrigió con la nueva versión de SDK.
https://developers.facebook.com/docs/ios/change-log-4.x
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.