2013-04-10 12 views
7

私はiOSゲームのいずれかでiOS Facebookログインプロセス全体を実装しました。 アプリでは、電子メールアカウントまたはFacebookを使用してログインできます。私は時折、ユーザーが電子メールでログインした場合、彼のアカウントをFacebookと同期させるためのビューを表示します。ここでFBSession.activeSession.isOpenは、ユーザーがログインしてもNOを返します

は私がユーザーに、このビューを表示する必要がありwheitherかを決定するために使用しているコードです:

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

最初は素晴らしい仕事に見えたが、それはそのFBSession.activeSession.isOpenが判明しますユーザーがFBでログインしていても、ある時点でNOを返します。

私の最初の推測は、accessTokenの有効期限が切れることです。私は自分のアプリケーションで次のようにやっているので、それが良い手掛かりかどうかわからない:didFinishLaunchingWithOptions:メソッド(Facebookがすることをお勧めしますように):

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

は、だから今、私はこの問題を再現するか、修正方法が分かりません、 何か案が?アプリの起動後にトークンが期限切れになる可能性はありますか?ユーザーが静かな長い時間のためにバックグラウンドでアプリを保持している場合のように?

答えて

20

アプリを起動するたびにセッションを再開する必要があります。あなたの推測は正しいものです。トークンの状態なので、単純な解決策は[FBSession activeSession] .isOpen状態を返し、NOを返す場合はopenActiveSessionWithAllowLoginUIを呼び出します。< <同じfacebookメソッドですが、返される状態はすべてチェックします。

セッションが以前に開かれていた場合は、保存されたトークンを使用してセッションを再開します。セッションが以前に開かれたときに再び表示されないため、ログインUIは心配しないでください。

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

とアプリデリゲート

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

にそれは簡単な修正だと、それは動作しますが、あなただけのセッションを閉じても、それを再現することができますが、[[FBSession activeSession] close]を使用してトークンキャッシュをクリアせずにあなたも変更することができますここに記載されているようなトークンキャッシュポリシーhttp://developers.facebook.com/docs/howtos/token-caching-ios-sdk/

+1

私も同じ問題に直面していますが、私の場合は、再びアプリケーションを起動するとセッションがなくなります。私も新しいセッションを作成して開こうとしましたが、動作していませんでした。 – ViruMax

+1

私の問題を完璧に解決しました! iOSのFacebookSDKでは 'checkSessionState:state'の' FBState'が 'FBSessionState'に変更されました。 SDKのバージョン番号が見つかりませんでした。現在の実際のバージョンは3.13です。 – jerik

関連する問題