unity react fbsdkloginkit fbsdkcorekit objective-c ios facebook facebook-ios-sdk

objective c - react - Manejar accesos inválidos con FBSession openActiveSessionWithReadPermissions en Facebook iOS 3.1.1 SDK



fbsdkloginkit (1)

Antes de nada, he leído tanto esto como estas preguntas para resolver el problema a continuación y antes de preguntar.

Mi problema es que cuando el accessToken expira (ya sea porque pasa la fecha de caducidad o manualmente al eliminar la aplicación del App Center de Facebook), aparece el siguiente código:

if ([[FBSession activeSession] isOpen]) { //do something } else { [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if(FB_ISSESSIONOPENWITHSTATE(status)) { //do something } } }]; }

entra en el bloque else con FBSession.activeSession abierto, pero cuando se ejecuta ''hacer algo'' el accessToken no es válido por lo que la solicitud obtiene Error: código de estado HTTP: 400. Cuando trato de hacer todo el procedimiento dos veces inmediatamente, la FBSession pide permiso (UIAlertView para iOS6 integrado en Facebook, Facebook App o el sitio web de Facebook en Safari) y el resto funciona sin problemas.

Mi preocupación es por qué tengo que hacer todo dos veces para que funcione bien y por qué Facebook SDK no puede detectar la primera vez que activeSession y accessToken no son válidos.

¡Gracias a todos de antemano!


Las preguntas que vinculó son relevantes, especialmente Facebook SDK 3.1 - Error al validar el token de acceso que explica el problema por el cual la cuenta de Facebook en el dispositivo no está sincronizada con el servidor (es decir, si eliminó la aplicación del Centro de aplicaciones). Como se menciona allí, en 3.1.1, el SDK llamará para renovar el token del dispositivo solo cuando recibe la respuesta no válida del servidor. Esta es una compensación en la conveniencia de menos viajes de ida y vuelta al servidor.

Suponiendo que su bloque de código se ejecuta en applicationDidFinishLaunching o algo similar, irá al bloque else porque la aplicación comienza con una nueva sesión. Cuando llama a openActiveSessionWithReadPermissions, el dispositivo con iOS 6 cree que el token es válido y permitirá que el estado pase a Open, por lo que se ejecutará tu "hacer algo". Solo entonces el SDK obtiene la respuesta inválida del servidor e invalida el token del dispositivo. Como resultado, la próxima vez que se llame al procedimiento, se le pedirá al usuario que autorice nuevamente.

Esto es intencional. Por ahora, puede considerar un reintento automático en su aplicación si el código de error describe un token no válido. Por ejemplo, vea el código de reutilización de la muestra Scrumious postOpenGraph. En su caso, puede parecer más cercano a algo así como (utilicé requestForMe como el "haz algo" para fines de demostración):

else { [FBSessionopenActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if(FB_ISSESSIONOPENWITHSTATE(status)) { //do something [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error){ NSLog(@"success on first try"); } else if ([[error userInfo][FBErrorParsedJSONResponseKey][@"body"][@"error"][@"code"] compare:@190] == NSOrderedSame) { //requestForMe failed due to error validating access token (code 190), so retry login [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) { if (!error){ //do something again, or consider recursive call with a max retry count. NSLog(@"success on retry"); } }]; } }]; } }]; }