Error de usuario no registrado en Facebook SDK iOS

¿Cómo puedo corregir este error en mi progtwig? Usando Facebook SDK.

Error Domain=facebookErrDomain Code=10000 "The operation couldn't be completed. (facebookErrDomain error 10000.)" UserInfo=0x5da9b10 {error=<CFBasicHash 0x5db09a0 [0x1087400]>{type = mutable dict, count = 2, entries => 2 : <CFString 0x5db7920 [0x1087400]>{contents = "type"} = <CFString 0x5d35420 [0x1087400]>{contents = "OAuthException"} 3 : <CFString 0x5d34970 [0x1087400]>{contents = "message"} = <CFString 0x5da96b0 [0x1087400]>{contents = "Error validating access token: The session is invalid because the user logged out."} } } 

Creo que la solución publicada no está completa. Explicaré por qué:

Los errores de token de acceso se devuelven cuando expira la session de Facebook y se continúa utilizando un token de acceso antiguo. El cierre de session no es el único escenario en el que caducan las sesiones (por ejemplo, cambiar la contraseña de inicio de session en la web). Por lo tanto, no basta con simplemente limpiar los valores pnetworkingeterminados del usuario después de cerrar session.

Desde el lado del cliente, no sabemos si el token de acceso que tenemos es realmente válido, hasta que una respuesta llegue con dicha información. Por lo tanto, debe detectar errores de token de acceso y restaurar la instancia de Facebook en un estado de trabajo limpiando el token de acceso antiguo y la date de caducidad. De esta forma, el usuario deberá iniciar session nuevamente para get un nuevo token de acceso.

Entonces, IMO, lo que debes hacer es:

  1. Maneje los errores y detecte cuándo se produjo un error de token de acceso.

  2. Cuando se produce un error de token de acceso, cierre session automáticamente y limpie los valores pnetworkingeterminados del usuario para eliminar el token de acceso antiguo (paso 3).

  3. Como resultado del cierre de session, debe limpiar los valores pnetworkingeterminados del usuario para el token de acceso y la date de caducidad (como enbr posted).

Aquí tiene un código que puede usarse para detectar errores de token de acceso:

 -(BOOL)isAccessTokenError:(NSError *) error { if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000 ) { NSDictionary *userInfo = [error userInfo]; NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"]; if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) { //Invalid access token return YES; } } if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) { //Error accessing access token return YES; } return NO; } 

Los lugares para manejar tales errores son:

 - (void)request:(FBRequest*)request didFailWithError:(NSError*)error; - (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error; 

Espero que esto ayude.

ACTUALIZACIÓN: olvidé mencionar. Si está utilizando la function SSO (muy probablemente), creo que es una muy buena idea limpiar las cookies de Facebook antes de iniciar session. A veces, después de un error de token de acceso no válido, parece que el inicio de session no devolverá el object de Facebook a un estado de trabajo (token de acceso válido) a less que se realice un "inicio de session limpio". Sin embargo, no siempre funciona.

Además, si no está utilizando la function SSO, esto solía corregir la window emergente de inicio de session fantasma que parecía desaparecer automáticamente de nuevo.

Así es como limpio las cookies:

 NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage shanetworkingHTTPCookieStorage]; NSArray* facebookCookies = [cookies cookiesForURL: [NSURL URLWithString:@"http://login.facebook.com"]]; for (NSHTTPCookie* cookie in facebookCookies) { [cookies deleteCookie:cookie]; } enter code here 

Acabo de encontrar este error también. Esta es la solución. Coloque este código en su FBSessionDelegate principal (probablemente su delegado de la aplicación).

 - (void)fbDidLogout { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"FBAccessTokenKey"]; [defaults removeObjectForKey:@"FBExpirationDateKey"]; [defaults synchronize]; } 

¡Luego elimina y vuelve a instalar la aplicación!