iOS 6 Facebook Zaloguj się nie odświeżając tokena dostępu

Nic, co czytam (wiele artykułów FB dev i pytanie SO), pomaga, więc pomyślałem, że opublikuję tutaj. Staram się, aby to wszystko działało z iOS 6 i Facebook SDK 3.1.1.

Mam dość podstawową konfigurację: moja aplikacja iOS uwierzytelnia się na Facebooku, przekazuję access_token na mój serwer, a użytkownik jest teraz zalogowany do mojej aplikacji. Jedyną rzeczą, jaką mogą zrobić w związku z Facebookiem, jest umieszczenie czegoś na ścianie. Używam starszego okna dialogowego, aby użytkownik mógł dodawać własne komentarze.

Wszystko działa idealnie podczas nowej instalacji przez pierwszą godzinę. Jeśli użytkownik jest zalogowany za pomocą aplikacji Ustawienia systemu iOS, otrzyma szybkie pole potwierdzenia systemu iOS, otrzymam jego token, wyśle ​​go na mój serwer i wszyscy będziemy dobrze.

Jeśli wkleję otrzymany token do debugera tokenu dostępu Facebooka, oznacza to, że wygaśnie on za godzinę.

Jeśli poczekam tę godzinę i wrócę do aplikacji później, wszystko, co próbuję zrobić, powoduje ten błąd:

{"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. }
Co muszę zrobić, aby wszystko po prostu działało?Przeczytałem że w SDK 3.1.1 FBSession po prostu się tym zajmie, ale to nie wygląda na przypadek. Mój token dostępu wygasa, a gdy to się stanie, zestaw SDK dla systemu iOS / FB nie zwróci mi odświeżonego.Nawet wylogowanie (które wywołuje[FBSession.activeSession closeAndClearTokenInformation]) nie rozwiązuje tego. Jedyne, co mogłem zrobić, to „Zresetuj zawartość i ustawienia” w preferencjach symulatora iOS, wprowadź ponownie moje dane uwierzytelniające w ustawieniach.app i odbuduj moją aplikację. Tylko wtedy mogę dostać kolejny token, który wygaśnie za godzinę.

Losowe notatki:

Po wznowieniu aplikacji dzwonię[FBSession.activeSession handleDidBecomeActive] i[self.facebook extendAccessTokenIfNeeded]Zgodnie z powyższym pytaniem SO, SDK powinien automatycznie dzwonićFBSession#renewSystemAuthorization. Umieściłem tam NSLog i nigdy nie widzę, że metoda jest wywoływana.

AKTUALIZACJA # 1:

Wspomniałem, że przeczytałem, że SDK będzie obsługiwać nieprawidłowe / wygasłe tokeny. Wydaje się, że powinno się to zdarzyć w FBRequestConnection # completeWithResults: orError :. Zobacz komentarze wbudowane, aby uzyskać informacje o ścieżce kodu.

- (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];
        }
    }

    ...
}