Facebook iOS SDK 3.1.1"closeAndClearTokenInformation"方法无效

Spe*_*niz 14 authentication sdk facebook logout ios

我刚从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
Run Code Online (Sandbox Code Playgroud)

[更新2]

改变了我的逻辑......改变了我原来的代码:

if (FBSession.activeSession.isOpen)
 //logged in
else
 //not logged in
Run Code Online (Sandbox Code Playgroud)

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

小智 22

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

我将所有这些方法调用在一起,以确保它真正注销.疯狂的错误.

[FBSession.activeSession closeAndClearTokenInformation];
[FBSession.activeSession close];
[FBSession setActiveSession:nil];
Run Code Online (Sandbox Code Playgroud)

  • 即使在写完这些行之后,它也会在下次打开旧会话. (2认同)

Mar*_*ini 6

我知道这可能会迟到但是在Android(3.0 SDK)上,如果您不在创建它的同一个Context中(或者如果应用程序已关闭且会话未获得某种方式),则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);
   }
}
Run Code Online (Sandbox Code Playgroud)

这有效地使我的会话成为:

{Session state:CREATED, token:{AccessToken token: permissions:[]}, appId:xxxxx}
Run Code Online (Sandbox Code Playgroud)

请记住,创建的与Closed(或Open)不同.从该状态,您可以毫无问题地重新打开会话.

希望这可以帮助.