2013-05-24 11 views
10

Ich habe den folgenden Code, den ich während der Facebook-Anmeldung verwende.FaceBook SDK3.5 closeAndClearTokenInformation ruft den Vervollständigungshandler von openActiveSessionWithReadPermissions

- (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI 
      withCompletionHandler:(void (^)())completionHandler 
{ 

    NSArray *permissions = [NSArray arrayWithObjects: 
         @"user_photos", 
         @"email", 
         nil]; 
    return [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     if (error != nil) { 
     ... 
     } else { 
      switch (state) { 
       case FBSessionStateOpen: 
       { 
        ... 
       } 
       case FBSessionStateClosed: 
       { 
        ... 
       } 
       case FBSessionStateClosedLoginFailed: 
       { 
        ... 
       } 
       default: 
        break; 
      } 
     } 
    }]; 
} 

Das oben genannte funktioniert gut für die Anmeldung. Aber, wenn ich den folgenden Code

[FBSession.activeSession closeAndClearTokenInformation]; 

dies wieder mit ausloggen ruft die completionHandler von openActiveSessionWithReadPermissions: Berechtigungen allowLoginUI :. Das ergibt für mich keinen Sinn. Ich denke nicht, dass es das richtige Verhalten ist. Hat jemand dieses Problem gesehen? Wie loggen wir uns aus? Ich verwende SDK 3.5 auf iOS6.

+0

Was die 'state' Wert ist, wenn Handler Abschluss ist aufgerufen an '[FBSession.activeSession closeAndClearTokenInformation];' – Geek

+0

Der Wert von 'state' ist' FBSessionStateOpen', wenn ich '[FBSession.activeSession closeAndClearTokenInformation]' ' –

+0

anruft Hast du zuerst versucht' FBSession's 'close' Methode aufzurufen und dann 'ClearToken' Methode? Wenn das Problem weiterhin besteht, müssen Sie sich mehr Code ansehen. Vielleicht dein Programmierfehler. – Geek

Antwort

2

Laut this thread auf der Facebook-Entwickler Bug-Tracker, ist dieses Verhalten "von Design".

In der Tat habe ich vorschlagen, ein besserer Name für diese Methode wäre: openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:

wie genauer beschreibt, was passiert (die „completionHandler“ ist in der Tat auf Zustandswechsel genannt).

Sie können damit umgehen in mehrfacher Hinsicht: Ben Cohen vorschlagen, dass Sie entweder die completionHandler-nil im Abschluss Block einstellen (run-once gewährleisten), schlägt this answer einen FBSessionStateHandler Lauf einmal Handler erstellen, oder Sie können auf den Schalter Zustandsänderung.

Im Idealfall, da wir uns für bestimmte Zwecke (Einloggen, Abmelden, Anfragen usw.) auf das Facebook SDK verlassen, würden diese über Delegierte bereitgestellt, aber da die SDK-Entwickler anscheinend ein bisschen davon getragen wurden " ooh blocks !! ", müssen Sie Ihren Zustandsänderungs-Handler an dem Punkt definieren, an dem Sie Ihre Sitzung zum ersten Mal öffnen.

+0

Anders als der "Hack" von Adam Wallner als mögliche Antwort in diesem Thread vorgeschlagen, eine andere Lösung für das Problem ist, überprüfen Sie in der Abschluss-Block den effektiven Zustand der FB-Sitzung: if (Zustand == FBSessionStateOpen || Zustand == FBSessionStateOpenTokenExtended) {// gerade angemeldet ... } else if (Fehler) { // Fehler beim Anmelden ... } else {// geschlossen } – viggio24

0

Das ist ein sehr schlechtes Verhalten, denke ich.

FBSession hat eine versteckte Eigenschaft:

@property (readwrite, copy) FBSessionStateHandler loginHandler; 

So können Sie es zu null durch diesen Code im Block wie folgt festgelegt:

[FBSession openActiveSessionWithReadPermissions:FACEBOOK_PERMISSIONS 
              allowLoginUI:NO 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
              [[FBSession activeSession] performSelector:NSSelectorFromString(@"setLoginHandler:") withObject:nil]; 
#pragma clang diagnostic pop 
              // Your stuff... 
             }];