2

我知道如何登录

[FBSession openActiveSessionWithReadPermissions:readPermissions allowLoginUI:YES completionHandler:
 ^(FBSession *session,FBSessionState state, NSError *error) {
     [self sessionStateChanged:session state:state error:error];//This is done on main thread already
 }];

问题是注销时要做什么,比如当用户按下注销按钮时?

目前我只是做

[FBSession.activeSession closeAndClearTokenInformation];
[[NSNotificationCenter defaultCenter] postNotificationName:FACEBOOKSESSIONCHANGED object:self];

但是,我不认为这是真的。[FBSession.activeSession closeAndClearTokenInformation]; 应该在 [self sessionStateChanged:session state:state error:error] 处调用;注销后。

那么我应该怎么做才能注销?

我从 facebook 检查了美味的样本,我找不到他们的注销机制。似乎他们使用具有委托的专用 facebook viewController。但是没有一个代表被调用。

4

2 回答 2

1

注销机制,他们只是通过释放访问令牌并将其设置为零来使访问令牌无效。但是,如果您的登录是使用 safari,那么 cookie 仍然存在。所以下次如果用户打开 safari 并尝试访问 Facebook,它会说它已经被授权。要删除 cookie,我使用以下方法

- (void)fbDidLogout
{
  NSLog(@"Logged out of facebook");
  NSHTTPCookie *cookie;
  NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  for (cookie in [storage cookies])
   {
       NSString* domainName = [cookie domain];
       NSRange domainRange = [domainName rangeOfString:@"facebook"];
       if(domainRange.length > 0)
       {
            [storage deleteCookie:cookie];
       }
   }
}

为了更加确定,您也可以调用,因为即使在调用 closeAndClearTokenInformation 之后,也有一些错误会返回打开的会话。https://developers.facebook.com/bugs/497294866962479?browse=search_507cb8ebc4f025673237228

[FBSession.activeSession closeAndClearTokenInformation];
[FBSession.activeSession close];
[FBSession setActiveSession:nil];

其他选项是在检查活动会话时使用以下条件。

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

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

于 2013-02-15T05:26:56.493 回答
0

不确定是否还有人对此感到困扰,但是使用最新版本的 Facebook SDK,我无法让 iPad 在注销后强制登录。这里仍然有些奇怪——“清除 cookie”代码被跳过了——有没有不同的方法来清除 iPad 中的 cookie?杰瑞

于 2015-02-07T20:35:10.517 回答