14

我刚刚从 Facebook iOS SDK 3.0.X 升级到 3.1.1,并重写了一些代码......

根据注销工作流程的 Facebook 文档(https://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/authenticate/#step3),我正在调用FBSession.activeSession对象的closeAndClearTokenInformation方法。

这似乎对 Facebook 会话状态没有影响,因为在调用后立即检查它仍然会返回一个打开的会话。

就目前而言,一旦我的应用程序使用 Facebook 登录,它就不会注销。

[更新 1]

根据要求,这是我用来检查会话状态的代码:

if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded && FBSession.activeSession.isOpen)
 //logged in
else
 //not logged in

[更新 2]

稍微改变了我的逻辑......将我的原始代码更改为:

if (FBSession.activeSession.isOpen)
 //logged in
else
 //not logged in

因为FBSession.activeSession.state返回FBSessionStateOpen,而不是FBSessionStateCreatedTokenLoaded

4

2 回答 2

22

也许这会有所帮助。 https://developers.facebook.com/bugs/497294866962479?browse=search_507cb8ebc4f025673237228

我将所有这些方法一起调用以确保它确实是注销。疯狂的虫子。

[FBSession.activeSession closeAndClearTokenInformation];
[FBSession.activeSession close];
[FBSession setActiveSession:nil];
于 2012-11-18T20:07:18.520 回答
6

我知道这可能会迟到,但在 Android(3.0 SDK)上,如果您不在创建它的同一上下文中(或者如果应用程序已关闭并且会话没有以某种方式获取,则 Session.getActiveSession() 可能会返回 null恢复)。它发生了,它由 SDK 处理,所以你真的无能为力。

在这些情况下,调用 closeAndClearTokenInformation() 并没有多大作用(如果您查看源代码,您就会明白为什么)。对我来说,解决方案是这样的(在 Java 中):

Session session = Session.getActiveSession();
if (session != null) {
   Session.getActiveSession().closeAndClearTokenInformation();
   Session.getActiveSession().close();
   Session.setActiveSession(null);
} else {
   // construct a new session (there are different ways to do this, this is how I do it because I need to pass the FACEBOOK_API_KEY programmatically).
   session = new Session.Builder(MyApp.getInstance()).setApplicationId(Constants.FACEBOOK_API_KEY).build();
   if (session != null) {//to be safe
     //beware with the case of Session vs sesssion.
     Session.setActiveSession(session); 
     session.closeAndClearTokenInformation();
     session.close();
     Session.setActiveSession(null);
   }
}

这实际上使我的会话如下:

{Session state:CREATED, token:{AccessToken token: permissions:[]}, appId:xxxxx}

请记住,created 与 Closed(或 Open)不同。在该状态下,您可以毫无问题地重新打开会话。

希望这可以帮助。

于 2013-03-12T23:31:38.953 回答