ios - app - El inicio de sesión de Facebook nativo dejó de funcionar después de la actualización del SDK a 3.14
facebook ios login (5)
Actualización : de alguna manera, el comportamiento parece haber cambiado. Ya no recibo el mensaje de error, pero el inicio de sesión nativo todavía no funciona. En cambio, me redireccionan al cuadro de diálogo web si la aplicación de Facebook no está instalada. ¿Facebook eliminó el soporte de inicio de sesión nativo para el último SDK? Los permisos que solicité fueron "public_profile", "email" y "user_likes". También intenté eliminar el permiso "user_likes", ya que no forma parte de los permisos básicos que se indican aquí: https://developers.facebook.com/docs/ios/ui-controls#iosintegration Aún así, el cuadro de diálogo de inicio de sesión nativo no aparece. !
Recientemente, actualicé mi proyecto de iOS para usar la versión 3.14.0 del SDK de Facebook (actualizado de 3.13.0 a través de CocoaPods). Leí las notas de actualización y cambié el permiso "basic_info" a "public_profile" como se recomienda.
Si ahora llamo
FBSession openActiveSessionWithReadPermissions:
allowLoginUI:
completionHandler:
solo funciona a través del inicio de sesión de la aplicación web o Facebook. Si inicio sesión de forma nativa en la configuración del sistema operativo, el inicio de sesión falla con
Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)"
¿Alguien ha tenido problemas similares? ¿Ya no funciona el inicio de sesión nativo de esta manera? ¿O es un problema con los permisos "cambiados"?
Saludos K
Compruebe los permisos que solicita, en el nuevo SDK (3.14) el permiso basic_info ha quedado obsoleto y debe enviar la aplicación para su revisión para obtener permisos extendidos. Los permisos básicos son: public_profile, email y user_friends
Más información aquí: https://developers.facebook.com/docs/ios/upgrading
Me he encontrado con este problema también. Una solución rápida es simplemente hacer que el usuario elimine sus credenciales de Facebook de iOS, inicie sesión con su aplicación y luego vuelva a ingresar sus credenciales.
Tal vez te estés perdiendo este método:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [FBSession.activeSession handleOpenURL:url];
}
Ayudó a mi caso en el que tuve que migrar de la 3.9.0 a la última. Espero eso ayude.
También corrí a este tema, aquí están los detalles sobre lo que sucedió y cómo arreglé mi aplicación.
Línea de fondo
Debido al nuevo proceso de inicio de sesión en el que los usuarios ahora pueden aprobar / rechazar cada permiso solicitado (algo que no admite el inicio de sesión integrado ios nativo), Facebook ha cambiado el comportamiento de inicio de sesión predeterminado de sdk para probar primero la aplicación rápida de Facebook y luego recurrir al vista web, ignorando por completo cualquier credencial de Facebook del nivel del sistema ios.
Esto se observa en la guía de actualización (formulario 3.13> 3.14) aquí: https://developers.facebook.com/docs/ios/upgrading
Porción relevante:
"El comportamiento de inicio de sesión predeterminado ha cambiado de FBSessionLoginBehaviorUseSystemAccountIfPresent a FBSessionLoginBehaviorWithFallbackToWebView".
¿Entonces lo que hay que hacer?
Bueno, si no necesita ninguna de las cosas nuevas, FBLikeControl, etc., que se introdujeron en 3.14, podría simplemente cambiar a 3.13. Sin embargo, si desea / necesita usar 3.14n, hay un método de instancia en FBSession que toma FBSessionLoginBehavior como parámetro: https://developers.facebook.com/docs/reference/ios/current/class/FBSession/#openWithBehavior:completionHandler :
Actualicé el cuerpo de mi método para abrir una sesión de Facebook desde:
[FBSession openActiveSessionWithReadPermissions:@[@"email", @"user_location"] allowLoginUI:YES completionHandler: ^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; } ];
a:
FBSessionStateHandler completionHandler = ^(FBSession *session, FBSessionState status, NSError *error) { [self sessionStateChanged:session state:status error:error]; }; if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) { // we have a cached token, so open the session [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:completionHandler]; } else { [self clearAllUserInfo]; // create a new facebook session FBSession *fbSession = [[FBSession alloc] initWithPermissions:@[@"email", @"user_location"]]; [FBSession setActiveSession:fbSession]; [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:completionHandler]; }
NOTA: mi método clearAllUserInfo incluye las siguientes líneas:
[FBSession.activeSession closeAndClearTokenInformation]; [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) { NSLog(@"%@", error); }]; [FBSession setActiveSession:nil];
También vale la pena consultar la documentación de Facebook sobre las sesiones de comprensión: http://developers.facebook.com/docs/facebook-login/ios/v2.0#sessions
si usa Facebook SDK 4.0, se puede establecer un comportamiento de inicio de sesión. El valor predeterminado es FBSDKLoginBehaviorNative
, pero puede establecerlo en FBSDKLoginBehaviorSystemAccount
.
Vea el siguiente código:
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
login.loginBehavior = FBSDKLoginBehaviorSystemAccount;
[loginManager logInWithReadPermissions:@[@"email"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
//TODO: process error or result
}];