7 votes

Le SDK iOS de Facebook 3.1 se bloque lors d'un appel ultérieur à FBSession openWithBehavior.

Si nous appelons openWithBehavior après un appel à closeAndClearTokenInformation, cela provoque EXC_BAD_ACCESS. Peu importe que l'on utilise la boîte de dialogue intégrée native d'iOS ou l'une des boîtes de dialogue à commutation rapide.

Notre code pour se connecter à FB, la première fois fonctionne :

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

Notre code pour se déconnecter, après quoi le code ci-dessus échoue après openWithBehavior :

[[FBSession activeSession] closeAndClearTokenInformation];

J'utilisais initialement openActiveSessionWithReadPermissions au lieu de openWithBehavior, comme prescrit dans la documentation de la version 3.1, ce qui ne provoque pas de plantage, mais le passage de l'application FB à Safari ne fonctionne pas. Peut-être à cause de la nécessité d'avoir un suffixe ? Si le plus simple est de corriger le changement d'application et de revenir à cela, merci de nous le dire.

Gracias.

7voto

leontx Points 530

Lorsque je l'ai exécuté dans le simulateur 5.x, j'ai vu un message d'erreur supplémentaire, très utile, provenant de openWithBehavior, puis je l'ai regardé dans la source qui rend les choses beaucoup plus claires :

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

J'ai modifié mon code afin de toujours créer une nouvelle session avant d'appeler openWithBehavior et cela semble correct.

UPDATE : Voici le code mis à jour qui vérifie si une session est active, puis la ferme, avant de toujours instancier une nouvelle session...

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X