7

iOS ゲームの 1 つで iOS Facebook ログイン プロセス全体を実装しました。アプリでは、メール アカウントまたは Facebook 経由でログインできます。ユーザーが電子メールでログインしている場合、自分のアカウントを Facebook と同期するようにユーザーに勧めるビューを時々表示します。

このビューをユーザーに表示する必要があるかどうかを判断するために使用しているコードは次のとおりです。

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

最初はうまくいくように見えましたが、ユーザーが FB でログインしていても、ある時点で FBSession.activeSession.isOpen が NO を返すことが判明しました。

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

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

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

4

1 に答える 1

20

これは単なる Facebook の動作です。アプリを起動するたびにセッションを「再開」する必要があります。推測は正しいです。トークンの状態が原因です。簡単な解決策は、[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/

于 2013-04-18T18:13:42.237 に答える