iOS 6 Facebook Login no refrescante token de acceso

Nada de lo que estoy leyendo (muchos artículos de desarrollo de FB y la pregunta SO) está ayudando, así que pensé en publicar aquí. Estoy intentando que todo esto funcione con iOS 6 y Facebook SDK 3.1.1.

Tengo una configuración bastante básica: mi aplicación iOS se autentica con Facebook, paso el access_token a mi servidor y el usuario ahora está conectado a mi aplicación. Lo único que pueden hacer relacionado con Facebook es publicar algo en su muro. Estoy usando la ventana de diálogo heredada para que el usuario pueda agregar sus propios comentarios.

Todo funciona perfectamente en una nueva instalación durante la primera hora más o menos. Si el usuario ha iniciado sesión a través de la aplicación de configuración de iOS, aparece un cuadro de confirmación de iOS rápido, recibo su token, lo envío a mi servidor y todos estamos bien.

Si pego el token que recibo en el depurador de token de acceso de Facebook, muestra que caducará en una hora.

Si espero esa hora y vuelvo a la aplicación después, cualquier cosa que intente hacer me da este error:

{"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. }
¿Qué necesito hacer para que las cosas funcionen?he leído que en el SDK 3.1.1 FBSession solo se encargará de ello, pero no parece ser el caso. Mi token de acceso está caducando y, una vez que lo hace, iOS / FB SDK no me devolverá uno actualizado.Incluso cerrar sesión (que llama[FBSession.activeSession closeAndClearTokenInformation]) no arregla esto. Lo único que he podido hacer es "Restablecer contenido y configuración" en las Preferencias del simulador de iOS, volver a ingresar mis credenciales de FB en Settings.app y reconstruir mi aplicación. Solo así podré obtener otro token que caducará en una hora.

Notas al azar:

Cuando mi aplicación se reanude, estoy llamando[FBSession.activeSession handleDidBecomeActive] y[self.facebook extendAccessTokenIfNeeded]De acuerdo con la pregunta de SO vinculada a lo anterior, el SDK debería llamar automáticamenteFBSession#renewSystemAuthorization. He puesto un NSLog allí, y nunca veo que se llame a ese método.

ACTUALIZACIÓN # 1:

Mencioné que he leído que el SDK manejará tokens inválidos / caducados. Parece que eso debería suceder en FBRequestConnection # completeWithResults: orError :. Ver comentarios en línea para notas sobre la ruta del código.

- (void)completeWithResults:(NSArray *)results
                orError:(NSError *)error
{
    int count = [self.requests count];
    for (int i = 0; i < count; i++) {
        FBRequestMetadata *metadata = [self.requests objectAtIndex:i];
        id result = error ? nil : [results objectAtIndex:i];
        NSError *itemError = error ? error : [self errorFromResult:result];

        id body = nil;
        if (!itemError && [result isKindOfClass:[NSDictionary class]]) {
            NSDictionary *resultDictionary = (NSDictionary *)result;
            body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]];
        }

        ...

        // *******************************************
        // My code actually falls into this block, proving that I do in fact have an invalid session
        // *******************************************
        if ([self isInvalidSessionError:itemError
                        resultIndex:error == itemError ? i : 0]) {
            [metadata.request.session closeAndClearTokenInformation:itemError];

            // *******************************************
            // Unfortunately metadata.request.session is nil, so this condition is never
            // run, so renewySystemAuthorization is never called
            // *******************************************
            if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){
                [FBSession renewSystemAuthorization];
        }
    }

    ...
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta