iOS 6 Facebook Login aktualisiert das Zugriffstoken nicht

Nichts, was ich lese (viele FB-Dev-Artikel und SO-Fragen), hilft, also dachte ich, ich würde es hier posten. Ich versuche, dies alles mit iOS 6 und Facebook SDK 3.1.1 zum Laufen zu bringen.

Ich habe ein ziemlich einfaches Setup: Meine iOS-App authentifiziert sich bei Facebook, ich übergebe das access_token an meinen Server und der Benutzer ist jetzt in meiner App angemeldet. Das Einzige, was sie im Zusammenhang mit Facebook tun können, ist, etwas an ihre Pinnwand zu posten. Ich verwende das alte Dialogfenster, damit der Benutzer seine eigenen Kommentare hinzufügen kann.

Bei einer Neuinstallation funktioniert in der ersten Stunde oder so alles einwandfrei. Wenn der Benutzer über die App "iOS-Einstellungen" angemeldet ist, wird ihm ein schnelles Bestätigungsfeld für iOS angezeigt. Ich erhalte das Token, sende es an meinen Server und wir sind alle in Ordnung.

Wenn ich das erhaltene Token in den Access Token-Debugger von Facebook einfüge, wird angezeigt, dass es in einer Stunde abläuft.

Wenn ich diese Stunde warte und danach zur App zurückkehre, gibt mir alles, was ich versuche, folgenden Fehler:

{"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. }
Was muss ich tun, damit die Dinge einfach funktionieren?Ich habe gelesen dass in SDK 3.1.1 FBSession sich nur darum kümmert, aber das scheint nicht der Fall zu sein. Mein Zugriffstoken läuft ab, und wenn dies der Fall ist, gibt mir das iOS / FB SDK kein aktualisiertes zurück.Sogar ausloggen (was anruft[FBSession.activeSession closeAndClearTokenInformation]) behebt das nicht. Das einzige, was ich tun konnte, war "Inhalte und Einstellungen zurücksetzen" in den iOS-Simulator-Einstellungen, meine FB-Anmeldeinformationen in Settings.app erneut eingeben und meine App neu erstellen. Nur dann kann ich einen weiteren Token erhalten, der in einer Stunde abläuft.

Zufällige Notizen:

Wenn meine App fortgesetzt wird, rufe ich an[FBSession.activeSession handleDidBecomeActive] und[self.facebook extendAccessTokenIfNeeded]Gemäß der oben verlinkten SO-Frage sollte das SDK automatisch anrufenFBSession#renewSystemAuthorization. Ich habe dort ein NSLog eingefügt und sehe nie, dass diese Methode aufgerufen wird.

UPDATE # 1:

Ich erwähnte, dass ich gelesen habe, dass das SDK ungültige / abgelaufene Token verarbeiten wird. Es scheint, dass dies in FBRequestConnection # completeWithResults: orError: passieren sollte. Hinweise zum Codepfad finden Sie in den Inline-Kommentaren.

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

    ...
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage