0

我有以下使用 facebook sdk 3.0.1 的场景。当用户首次登录并选择“FB 登录”时,SSO 启动,新会话打开,一切正常。但是,当用户关闭应用程序并重新启动它时 - 我不明白如何获取最后一个打开的会话,目前我正在打开一个新会话并且用户再次看到 FB 进度条(当它连接到再次使用 FB,即使用户在上次运行时已经批准了 FB)。有人知道如何跳过此操作吗?

编辑1:

这就是我检索会话的方式:

public void tryRetrievFacebookSession() {
    Session session = Session.getActiveSession();

    if (session != null && session.isOpened())
        return;

    session = Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            MobliLog.d("SplashScreen", "Inside call() with session with state: " + session.getState());
            // onSessionStateChanged(session, state, exception);
        }
    });

}

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session session = Session.getActiveSession();

    if (session != null)
        session.onActivityResult(this, requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data);

}

会话通常是通过 LoginButton 或以下行创建的:

session = Session.getActiveSession();

    if (session.getState().isClosed())
        session = new Session(this);

    if (session.isOpened()) {
        onAuthenticationEndListener.onSuccessfullAuthentication();
        return;
    } else {
        this.onFacebookAuthenticationEndListener = onAuthenticationEndListener;
        Session.setActiveSession(session);
        session.openForRead(new Session.OpenRequest(SocNetwksCompatScreen.this).setCallback(null));
        return;
    }

资料一:

当我做第一个 Session session = Session.getActiveSession(); 在 sso 身份验证后的登录中,我的会话状态为 CLOSED 而不是 OPENED

信息2:我正在使用uiHelper并像这样初始化它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    twitter = SocialPluginsUtils.getTwitterClient();

    uiHelper = new UiLifecycleHelper(this, statusCallback); 
    uiHelper.onCreate(savedInstanceState);
}

现在,我知道在我执行 Session.getActiveSession(); 之后 会话状态应该打开,然后打开,然后应该调用 uiHelper 的回调。在我的代码中,状态是 CLOSED 或 CLOSED_LOGIN_FAILED 或 CREATED(不确定为什么它不稳定),其余的不会发生

4

3 回答 3

2

事实上,每次用户关闭应用程序时会话都会关闭。
所以如果Session.getActiveSession()返回一个空会话,你只需要调用Session.openActiveSession(activity, true, sessionCallback).

如果存在有效的令牌缓存,此方法将使用它来打开新会话,而无需用户插入任何数据。否则,这将显示具有基本权限的默认对话框。

于 2013-04-24T11:23:36.740 回答
0

从我在您编辑后看到的情况来看,问题可能与您管理会话的方式有关。我在我的项目中使用此代码:

    Session session = Session.getActiveSession();

    if (session == null){
        Session.openActiveSession(activity, true, sessionCallback);
    }

    else if (!session.getState().isOpened()){
        session.openForRead(new Session.OpenRequest(activity)
                .setCallback(sessionCallback));
                    //this will open the session with basic read permissions
    }

    else {          
        //do what you want with the opened session
    } 

此外,如果您使用,UiLifecycleHelper则不需要我在评论中建议您的两行代码,它们已经在帮助程序的方法中。但是你必须确保在activity的每个相关方法(onResume、onPause等)中调用helper的所有方法。

如果没有令牌缓存,openActiveSession(activity, true, sessionCallback)它将自动调用一个新对话框,如果用户成功登录,则新的令牌缓存将可供将来使用。

于 2013-04-24T17:49:28.747 回答
0

问题解决了。我不小心调用了 session.closeAndClearTokenInformation(); 在 onStop() 中(是的,太愚蠢了!)

于 2013-04-25T10:13:02.630 回答