2013-04-10 14 views
7

Ho implementato l'intero processo di login di Facebook su iOS in uno dei miei giochi iOS. Nell'app, è possibile accedere con un account e-mail o tramite Facebook. Occasionalmente presenta una vista che invita l'utente a sincronizzare il suo account con Facebook se ha effettuato l'accesso con una e-mail.FBSession.activeSession.isOpen restituisce NO anche se l'utente ha effettuato il login

Ecco il codice che sto usando per determinare wheither o no dovrei visualizzare questa vista per l'utente:

if (FBSession.activeSession.isOpen) { 
    // Present the view 
} else { 
    // Go somewhere else 
} 

In un primo momento sembrava funzionare grande, ma si scopre che FBSession.activeSession.isOpen restituisce NO ad un certo punto anche se l'utente ha effettuato l'accesso con FB.

La mia prima ipotesi potrebbe essere che l'accessToken scada. Io non sono sicuro se è un buon indizio, perché sto facendo il seguito nella mia domanda: didFinishLaunchingWithOptions: il metodo (come Facebook raccomanda a):

if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) { 
    // Yes, so just open the session (this won't display any UX). 
    [self openSessionWithCompletionBlock:^{}]; 
} 

Così ora non ho idea di come riprodurre o per risolvere questo problema , qualche idea? È possibile che il token scada dopo l'avvio dell'app? Come se l'utente conservasse l'app in background per un lungo periodo di silenzio?

risposta

20

È solo un comportamento di Facebook, è necessario "riaprire" la sessione ogni volta che si avvia l'app, la tua ipotesi è giusta, è a causa dello stato token, una soluzione semplice è quella di controllare [FBSession activeSession] . isOpen state e se restituisce NO chiama openActiveSessionWithAllowLoginUI < < Sì, lo stesso metodo di Facebook, ma controlla tutti gli stati che restituisce.

Se la sessione è stato precedentemente aperto allora utilizza il token memorizzato per riaprire la sessione, non si deve preoccupare l'interfaccia utente di accesso perché non rivelerà ancora una volta come la sessione è stata aperta in precedenza.

if (![FBSession activeSession].isOpen) { 
    [self connectWithFacebook]; 
} 

- (void) connectWithFacebook { 
     // The user has initiated a login, so call the openSession method 
     // and show the login UI if necessary << Only if user has never 
     // logged in or ir requesting new permissions. 
     PPAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
     [appDelegate openSessionWithAllowLoginUI:YES]; 
} 

E in app delegato

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI 
{ 
    NSArray *permissions = @[@"any_READ_permision_you_may_need"]; 

    return [FBSession openActiveSessionWithReadPermissions:permissions 
               allowLoginUI:allowLoginUI 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
               if (error) { 
                NSLog (@"Handle error %@", error.localizedDescription); 
               } else { 
                [self checkSessionState:state]; 
               } 
             }]; 
} 

- (void) checkSessionState:(FBState)state { 
    switch (state) { 
     case FBSessionStateOpen: 
      break; 
     case FBSessionStateCreated: 
      break; 
     case FBSessionStateCreatedOpening: 
      break; 
     case FBSessionStateCreatedTokenLoaded: 
      break; 
     case FBSessionStateOpenTokenExtended: 
      // I think this is the state that is calling 
      break; 
     case FBSessionStateClosed: 
      break; 
     case FBSessionStateClosedLoginFailed: 
      break; 
     default: 
      break; 
    } 
} 

Si tratta di una soluzione rapida e funziona, è possibile riprodurre anche solo chiudendo la sessione, ma senza cancellare la cache dei token utilizzando [[FBSession activeSession] close] Si può anche cambiare la criterio della cache token come descritto qui http://developers.facebook.com/docs/howtos/token-caching-ios-sdk/

+1

hie, sto anche affrontando lo stesso problema, ma nel mio caso, quando lancio nuovamente l'applicazione, ottengo la sessione zero. Ho anche provato creando una nuova sessione e aprendola ma non funziona. – ViruMax

+1

ha risolto perfettamente il mio problema! Con il mio iOS FacebookSDK, 'FBState' cambiato in' FBSessionState' in 'checkSessionState: state'. Impossibile trovare il numero di versione dell'SDK, l'attuale attuale è 3.13. – jerik

Problemi correlati