2012-11-05 13 views
7

Se chiamiamo openWithBehavior dopo una chiamata a closeAndClearTokenInformation, causa EXC_BAD_ACCESS. Indipendentemente dal fatto che stia utilizzando la finestra di dialogo nativa di iOS nativa o una di quelle a commutazione veloce.Facebook iOS SDK 3.1 si interrompe in seguito alla chiamata a FBSession openWithBehavior

Il nostro codice per accedere a FB, prima volta attraverso le opere:

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

Il nostro codice il logout, dopo di che il codice di cui sopra non riesce dopo openWithBehavior:

[[FBSession activeSession] closeAndClearTokenInformation]; 

Inizialmente ero usando openActiveSessionWithReadPermissions invece di openWithBehavior, come prescritto nei documenti 3.1, che non si arresta in modo anomalo ma l'app che si sta spostando dall'app FB/Safari non ha funzionato. Forse a causa della necessità di avere un suffisso? Se fosse più semplice correggere l'app e tornare a quello, si prega di avvisare.

Grazie.

risposta

7

Quando ho eseguito nel simulatore 5.x, ho visto un messaggio in più, molto utile, errore dal openWithBehavior, poi guardò in su nella fonte che rende le cose molto più chiare:

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' Ho cambiato il mio codice per creare sempre una nuova sessione prima di chiamare openWithBehavior e sembra felice.

UPDATE: Ecco il codice aggiornato che controlla la presenza di una sessione attiva, poi lo chiude, prima di creare un'istanza sempre una nuova sessione ...

- (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

, non ho ottenuto dove e perché scrivo questo codice . e l'ho scritto prima di openWithBehaviour ancora si è bloccato in openWithBihaviour – Heena

+0

Il primo frammento di sopra è della classe facebook che stava lanciando l'errore. L'ho incluso solo per aggiungere il contesto a ciò che stava accadendo. Sono andato avanti e ho aggiunto il mio codice dopo aver aggiunto il controllo per una sessione attiva e chiuso, prima di creare sempre una nuova sessione. – leontx

Problemi correlati