2012-11-05 10 views
7

closeAndClearTokenInformationの呼び出し後にopenWithBehaviorを呼び出すと、EXC_BAD_ACCESSが発生します。ネイティブのiOS組み込みダイアログを使用しているのか、高速切り替えの組み込みダイアログを使用しているのかにかかわらず。Facebook FPSessionの後続呼び出しでiOS SDK 3.1がクラッシュするopenWithBehavior

作品を通してFB、初めてにログインする私たちのコード:

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

上記のコードはopenWithBehavior後に失敗した後にログアウトする当社のコード、:

[[FBSession activeSession] closeAndClearTokenInformation]; 

私が最初に代わりopenActiveSessionWithReadPermissionsを使用していたがopenWithBehaviorの3.1文書で規定されているように、クラッシュはしませんが、FB app/Safariから切り替えられたアプリは機能しませんでした。おそらくサフィックスを持つ必要があるからでしょうか?アプリの切り替えを直してそのことに戻るのが最も簡単な場合は、アドバイスをお願いします。

ありがとうございました。

答えて

7

私は5.xのシミュレータで実行したとき、私は、物事がはるかに明確にしたソースでそれを見上げ、openWithBehaviorから余分な、非常に参考に、エラーメッセージを見た:

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

私は」 openWithBehaviorを呼び出す前に常に新しいセッションを作成するようにコードを変更しました。

UPDATE: はここ

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

、私はどこに取得し、なぜこのコードを書いていない...そして、常に新鮮なセッションをインスタンス化する前に、それを閉じて、アクティブなセッションをチェックし、更新されたコードです。 OpenWithBehaviour openwithBehaviourでクラッシュしました。 – Heena

+0

上記の最初のスニペットは、エラーをスローしていたfacebookクラスからのものです。私は起こっていたことにコンテキストを追加するためにそれを含めました。私は先に進んで、常に新しいセッションを作成する前に、アクティブなセッションのチェックを追加して終了した後にコードを追加しました。 – leontx

関連する問題