2012-11-05 2 views
7

Wenn wir openWithBehavior nach einem Aufruf von closeAndClearTokenInformation aufrufen, verursacht es EXC_BAD_ACCESS. Unabhängig davon, ob es den integrierten nativen iOS-Dialog oder einen der schnell umschaltenden verwendet.Facebook iOS SDK 3.1 stürzt beim nachfolgenden Aufruf von FBSession ab openWithBehavior

Unser Code auf FB, zum ersten Mal durch Werke einloggen:

if (![FBSession activeSession]) { 
    #ifdef FREE_APP 
     NSString* suffix = @"free"; 
    #else 
     NSString* suffix = @"paid"; 
    #endif 
    FBSession *session = [[[FBSession alloc] initWithAppID:@"111111111111111" 
          permissions:permissions 
         urlSchemeSuffix:suffix 
        tokenCacheStrategy:nil] autorelease]; 
    [FBSession setActiveSession:session]; 
} 
else if ([FBSession activeSession].isOpen) 
    [[FBSession activeSession] close]; 

[[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent 
       completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
            [self sessionStateChanged:session state:state error:error]; 
           }]; 

Unser Code nach dem abzumelden, über den Code nicht nach openWithBehavior:

[[FBSession activeSession] closeAndClearTokenInformation]; 

ich zunächst openActiveSessionWithReadPermissions statt mit wurde of openWithBehavior, wie in der 3.1 Dokumentation beschrieben, die nicht abstürzt, aber die App, die von der FB app/Safari zurückwechselt, hat nicht funktioniert. Vielleicht wegen der Notwendigkeit, ein Suffix zu haben? Wenn es am einfachsten wäre, die App zu wechseln und zurück zu gehen, rate bitte.

Danke.

Antwort

7

Als ich in dem 5.x-Simulator lief, sah ich eine zusätzliche, sehr hilfreich, Fehlermeldung aus openWithBehavior, sah es dann in der Quelle bis den Dinge viel klarer macht:

if (!(self.state == FBSessionStateCreated || 
     self.state == FBSessionStateCreatedTokenLoaded)) { 
    // login may only be called once, and only from one of the two initial states 
    [[NSException exceptionWithName:FBInvalidOperationException 
          reason:@"FBSession: an attempt was made to open an already opened or closed session" 
          userInfo:nil] 
    raise]; 
} 

I‘ Ich habe meinen Code geändert, um immer eine neue Sitzung zu erstellen, bevor ich openWithBehavior aufruft, und es scheint glücklich zu sein.

UPDATE: Hier ist der aktualisierte Code, der für eine aktive Sitzung überprüft, dann schließt es, bevor immer eine frische Sitzung Instanziieren ...

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { 


     if ([FBSession activeSession]) 
     [[FBSession activeSession] closeAndClearTokenInformation]; 

     #ifdef FREE_APP 
     NSString* suffix = @"free"; 
     #else 
     NSString* suffix = @"paid"; 
     #endif 

     NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil]; 

     FBSession *session = [[FBSession alloc] initWithAppID:mFacebookID 
               permissions:permissions 
              urlSchemeSuffix:suffix 
             tokenCacheStrategy:nil]; 

     [FBSession setActiveSession:session]; 

     If (allowLoginUI == YES) { 
     NSLog(@"Calling openWithBehavior"); 
     [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent 
            completionHandler:^(FBSession *session, FBSessionState state, NSError *error) 
            { 
             [self sessionStateChanged:session state:state error:error]; 
            } 
     ]; 
    } else if(session.state == FBSessionStateCreatedTokenLoaded) { 
     NSLog(@"Calling openWith completion handler"); 
     [session openWithCompletionHandler:^(FBSession *_session, FBSessionState status, NSError *error) 
              { [self sessionStateChanged:session state:status error:error];} 
     ]; 
    } 

    [session release]; 

    return true; 
    } 
+0

, habe ich nicht bekommen, wo und warum Sie diesen Code schreiben . und ich schrieb es vor openWithBehaviour noch stürzte es in openWithBehaviour – Heena

+0

Der erste Ausschnitt oben ist von der Facebook-Klasse, die den Fehler warf. Ich fügte es nur hinzu, um dem Kontext etwas hinzuzufügen. Ich ging voran und fügte meinen Code hinzu, nachdem ich die Prüfung für eine aktive Sitzung hinzugefügt und sie geschlossen hatte, bevor immer eine neue Sitzung erstellt wurde. – leontx