with - ios facebook sdk 4.0 código de error de inicio de sesión 304
login facebook swift 3 (14)
304 indica que nada ha cambiado. Probablemente de alguna manera ya esté autenticado y, por lo tanto, sea nulo con 304 que indica que nada ha cambiado.
Acabo de actualizar Facebook SDK v4.0
y de acuerdo con el tutorial de Uso de IU de inicio de sesión personalizado
-(IBAction)facebookLoginClick:(id)sender {
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
// Process error
} else if (result.isCancelled) {
// Handle cancellations
} else {
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
if ([result.grantedPermissions containsObject:@"email"]) {
// Do work
}
}
}];
}
PERO el resultado es siempre nulo y el código de error es 304, ¿me falta algo?
En realidad, la razón es muy simple, puede intentar seguir el siguiente paso para volver a aparecer este código de error fácilmente.
El " error de inicio de sesión de Facebook " puede tener dos razones:
- obtienes la información del usuario de Facebook fail.
- obtienes la información del usuario del éxito de Facebook, pero la carga a tu propio servidor falla.
El código en
FBSDKLoginManager.m
es:
- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult
{
FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
parameters:nil
tokenString:loginResult.token.tokenString
HTTPMethod:nil
flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery];
[requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSString *actualID = result[@"id"];
if ([currentToken.userID isEqualToString:actualID]) {
[FBSDKAccessToken setCurrentAccessToken:loginResult.token];
[self invokeHandler:loginResult error:nil];
} else {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey];
NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain
code:FBSDKLoginUserMismatchErrorCode
userInfo:userInfo];
[self invokeHandler:nil error:resultError];
}
}];
}
cuando
currentToken.userID
no es igual a
actualID
, se arrojará el
FBSDKLoginUserMismatchErrorCode
.
Ahora, este problema volverá a aparecer cuando el usuario A falle en el inicio de sesión de Facebook, pero no tiene
[FacebookSDKManager logOut]
después del error, la aplicación almacenará en caché el AccessToken para el usuario A, y luego el usuario A cambiará la cuenta de Facebook al usuario B, cuando el usuario B inicie sesión en Facebook nuevamente, volverá a aparecer este problema.
Esto me sucedió cuando cambié el ID de aplicación de Facebook (en el archivo Info.plist) cambiando de una aplicación de prueba de Facebook a una aplicación de producción de Facebook.
Si su aplicación envía el token de Facebook a un servidor que genera un JWT, por ejemplo, Facebook SDK aún persiste el fbToken (
FBSDKAccessToken.currentAccessToken()
) persistió a menos que se le indique que lo elimine.
Eso también puede ocurrir en producción cuando un usuario cierra la sesión de la aplicación, una solicitud de API de cierre de sesión cerrará la sesión del usuario y restablecerá su JWT.
Pero incluso antes de enviar la solicitud de API de
FBSDKLoginManager
de sesión, el cliente deberá indicarle a la instancia de
FBSDKLoginManager
sesión.
if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
Para mí en Objective-C siguiente funcionó
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
[login logOut];
}
y el problema era que el usuario intentaba iniciar sesión como otro usuario como lo sugirió @Vineeth Joseph
Puede usar el siguiente código para resolver su problema:
[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
Según los documentos, 304
FBSDKLoginUserMismatchErrorCode
"indica un error al solicitar nuevos permisos porque el usuario ha cambiado"
.
Tiene sentido en el escenario @ Adrian999 mencionado.
También estuve estancado en este tema por un tiempo. luego creé un objeto para FBSDKLoginManager en el archivo .h y en viewDidLoad del archivo .m, inicialícelo y establezca la propiedad de cierre de sesión.
_fbLogin= [[FBSDKLoginManager alloc]init];
[_fbLogin logOut];
Esto me ayudó y la esperanza también te ayuda a ti. Todo lo mejor.
Gracias
Tuve esto, ocurrió al cambiar los detalles de la aplicación FB en Xcode mientras se ejecutaba una aplicación iOS. Debe eliminar la aplicación del dispositivo y luego volver a publicarla con la nueva configuración de la aplicación FB. Simplemente recompilar no es suficiente para borrar la configuración anterior de FB
Tuve un problema similar.
Después de inicializar
FBSDKLoginManager
, agregué una línea para eliminar los datos y el token (Facebook):
FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];
[loginmanager logOut];
Espero que esto ayude.
Por lo tanto, exactamente como el OP pregunta: "¿Me estoy perdiendo algo"?
Sí, el siguiente código de ejemplo estándar que se ve en todas partes es simplemente incorrecto:
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
---- ONE MAGIC LINE OF CODE IS MISSING HERE ----
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
tienes que hacer esto:
-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut]; //ESSENTIAL LINE OF CODE
[login logInWithReadPermissions:@[@"email"]
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error) {...}
else if (result.isCancelled) {...}
else { // (NB for multiple permissions, check every one)
if ([result.grantedPermissions containsObject:@"email"])
{ NSLog(@"%@",result.token); }
}
}];
}
De lo contrario, de manera muy simple, la aplicación no funcionará si el usuario cambia las cuentas de FB en el dispositivo. (¡A menos que por alguna razón vuelvan a instalar la aplicación!)
Una vez más, el popular código de muestra anterior
simplemente no funciona
(la aplicación entra en un bucle sin fin) si un usuario cambia las cuentas FB.
La llamada
logOut
debe hacerse.
Verifique el estado de su FBSession:
isOpen
Indicates whether the session is open and ready for use.
@property (readonly) BOOL isOpen;
Declared In: FBSession.h
https://developers.facebook.com/docs/reference/ios/3.0/class/FBSession/
Inicio de sesión único
También descubrí que este problema ocurre si tiene una aplicación que no requiere inicio de sesión único (es decir, una aplicación que múltiples usuarios crearán contenido y compartirán desde un dispositivo).
Puede cambiar el inicio de sesión único en la configuración de su aplicación https://developers.facebook.com/apps/your-app-id/settings/ .
Swift 3.0
func loginWithFacebook
{
let loginManager = FBSDKLoginManager()
if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID()
{
loginManager.logOut()
}
loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in
if error != nil {
print("error/(String(describing: error))")
}
else if (result?.isCancelled)! {
}
else {
print(FBSDKAccessToken.current())
}
})
}
Swift 4.0 y FBSDKCoreKit 4.33
let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
loginManager.logOut()
}
rápido 4.0, 4.2, 5.0
FBSDKLoginManager().logOut()