我在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;
}
信息1:
当我在做第一个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()之后;会话状态应该打开并在OPEN之后,然后应该调用uiHelper的回调。在我的代码中,状态是CLOSED或CLOSED_LOGIN_FAILED或CREATED(不确定为什么它不稳定),其余部分不会发生
答案 0 :(得分:2)
事实上,每次用户关闭应用程序时,会话都会关闭
因此,如果Session.getActiveSession()
返回空会话,则只需要调用Session.openActiveSession(activity, true, sessionCallback)
。
如果存在有效的令牌缓存,则此方法将使用它来打开新会话,而无需用户插入任何数据。否则,这将显示具有基本权限的默认对话框。
答案 1 :(得分: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
,你不需要我在评论中建议的两行代码,它们已经在帮助器的方法中了。但是你必须确保在活动的每个相关方法中调用助手的所有方法(onResume,onPause等)。
如果没有令牌缓存,openActiveSession(activity, true, sessionCallback)
将自动调用新对话框,如果用户成功登录,则新的令牌缓存将可供将来使用。
答案 2 :(得分:0)
问题解决了。我不小心打电话给session.closeAndClearTokenInformation();在onStop()(是的,这么愚蠢!)