2012-10-05 15 views
14

Antes de nada, he leído las preguntas this y this para resolver el problema a continuación y antes de preguntar.Manejar acceso no válido Retornar con FBSession openActiveSessionWithReadPermissions en Facebook iOS 3.1.1 SDK

Mi problema es que cuando el accessToken se expiró (ya sea porque la fecha de caducidad pasa, o manualmente mediante la supresión de la aplicación de mi App Center de Facebook) 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 
      } 
      } 
     }]; 
    } 

se interpone en el bloque else con Se abre FBSession.activeSession 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 intento hacer todo el procedimiento dos veces inmediatamente, la FBSession pide permiso (ya sea UIAlertView para iOS6 Facebook integrado, aplicación de Facebook o 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 por adelantado!

Respuesta

22

Las preguntas que ha vinculado son relevantes, especialmente Facebook SDK 3.1 - Error validating access token, que explica el problema de que 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 iOS 6 cree que el token es válido y permitirá que el estado pase a Open, por lo que se ejecutará su "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 invá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 "hacer 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"); 
         } 
        }]; 
       } 
      }]; 
     } 
    }]; 
} 
+1

¡Muchas gracias, Chris! Parece funcionar, aunque no con un segundo intento sino con el cuarto. Supongo que será algo fijo en una próxima actualización de SDK. – ozzotto

+0

El enfoque para obtener el código de error no parece funcionar de manera confiable. Creo que el formato JSON no es coherente: Error Domain = com.facebook.sdk Code = 5 "La operación no se pudo completar. (Com.facebook.sdk error 5)" UserInfo = 0x12c81710 {com.facebook.sdk : ParsedJSONResponseKey = ( { cuerpo = { error = { código = 190; mensaje = "el token de acceso fue invalidado en el dispositivo."; type = OAuthException; }; }; código = 400; } ), com.facebook.sdk: HTTPStatusCode = 400} – MaxGabriel

+0

- [__ NSArrayM objectForKeyedSubscript:]: selector no reconocido enviado a la instancia – MaxGabriel

Cuestiones relacionadas