2012-10-05 3 views
14

Vor allem habe ich sowohl this und this Fragen zu lösen das Problem unten und bevor Sie Fragen zu lösen.Handle ungültigen accessToken mit FBSession openActiveSessionWithReadPermissions in Facebook iOS 3.1.1 SDK

Mein Problem ist, dass, wenn die accessToken abgelaufen werden (entweder weil das Verfallsdatum passiert, oder manuell durch die App von meinem Facebook-App Center zu löschen) dem folgenden Code:

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

wird im else-Block mit FBSession.activeSession geöffnet, aber wenn die 'etwas tun' ist der AccessToken ungültig, so die Anfrage bekommt Fehler: HTTP-Statuscode: 400. Wenn ich versuche, die gesamte Prozedur zweimal sofort die FBSession fragt um Erlaubnis (entweder UIAlertView für iOS6 integrierte Facebook, Facebook App oder Facebook-Website in Safari) und der Rest läuft reibungslos.

Mein Anliegen ist, warum ich zweimal alles gut machen muss und warum Facebook SDK beim ersten Mal nicht erkennen kann, dass activeSession und accessToken ungültig sind.

Vielen Dank im Voraus!

Antwort

22

Die von Ihnen verknüpften Fragen sind relevant, insbesondere Facebook SDK 3.1 - Error validating access token, in der das Problem erklärt wird, dass das Facebook-Konto auf dem Gerät nicht mit dem Server synchronisiert ist (z. B. wenn Sie die App aus App Center gelöscht haben). Wie dort erwähnt, ruft das SDK in 3.1.1 auf, das Geräte-Token nur zu erneuern, wenn es die ungültige Antwort vom Server erhält. Dies ist ein Kompromiss in der Bequemlichkeit für weniger Rundreisen zum Server.

Angenommen, Ihr Code-Block wird auf applicationDidFinishLaunching oder etwas ähnlichem ausgeführt, wird er zum Else-Block geleitet, da die App mit einer neuen Sitzung beginnt. Wenn es openActiveSessionWithReadPermissions aufruft, denkt das iOS 6-Gerät, dass das Token gültig ist, und lässt den Status auf "Open" (Öffnen) setzen, damit Ihr "etwas" ausgeführt wird. Nur dann erhält das SDK die ungültige Antwort vom Server und macht das Geräte-Token ungültig. Wenn der Vorgang das nächste Mal aufgerufen wird, wird der Benutzer entsprechend aufgefordert, erneut zu autorisieren.

Dies ist beabsichtigt. Vorläufig können Sie eine automatische Wiederholung in Ihrer Anwendung in Erwägung ziehen, wenn der Fehlercode ein ungültiges Token beschreibt. Sehen Sie sich beispielsweise den Wiederholungscode Scrumptious sample postOpenGraph an. In deinem Fall sieht es vielleicht etwas ähnlicher aus (Ich habe forEmE als "mach etwas" zu Demonstrationszwecken benutzt):

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

Vielen Dank Chris! Es scheint zu funktionieren, aber nicht mit einer zweiten Wiederholung, sondern mit der vierten. Ich nehme an, dass es in einem nächsten SDK-Update behoben sein wird. – ozzotto

+0

Der Ansatz zum Ermitteln des Fehlercodes scheint nicht zuverlässig zu funktionieren. Ich denke, das JSON-Format ist nicht konsistent: Fehler Domain = com.facebook.sdk Code = 5 "Die Operation konnte nicht abgeschlossen werden. (Com.facebook.sdk Fehler 5.)" UserInfo = 0x12c81710 {com.facebook.sdk : ParsedJSONResponseKey = ( { body = { error = { code = 190; message = "die Zugriffstoken auf dem Gerät wurde für ungültig erklärt."; type = OAuthException; }; }; code = 400; } ), com.facebook.sdk: HTTPStatusCode = 400} – MaxGabriel

+0

- [__ NSArrayM objectForKeyedSubscript:]: unerkannter Selektor an Instanz gesendet – MaxGabriel