Ios6 FaceBook SDK3.5 closeAndClearTokenInformation调用openActiveSessionWithReadPermissions的完成处理程序
我在facebook登录时使用了以下代码Ios6 FaceBook SDK3.5 closeAndClearTokenInformation调用openActiveSessionWithReadPermissions的完成处理程序,ios6,facebook-ios-sdk,facebook-login,Ios6,Facebook Ios Sdk,Facebook Login,我在facebook登录时使用了以下代码 - (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI withCompletionHandler:(void (^)())completionHandler { NSArray *permissions = [NSArray arrayWithObjects: @"user_photos",
- (BOOL)openFBSessionWithAllowLoginUI:(BOOL)allowLoginUI
withCompletionHandler:(void (^)())completionHandler
{
NSArray *permissions = [NSArray arrayWithObjects:
@"user_photos",
@"email",
nil];
return [FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if (error != nil) {
...
} else {
switch (state) {
case FBSessionStateOpen:
{
...
}
case FBSessionStateClosed:
{
...
}
case FBSessionStateClosedLoginFailed:
{
...
}
default:
break;
}
}
}];
}
以上操作对于登录很好。但是,当我使用以下代码注销时
[FBSession.activeSession closeAndClearTokenInformation];
这将再次调用openActiveSessionWithReadPermissions的completionHandler:permissions allowLoginUI:。这对我来说毫无意义。我认为这不是正确的行为。有人见过这个问题吗?我们如何注销?我在iOS6上使用sdk3.5。根据Facebook开发者bug跟踪器上的说法,这种行为是“设计的”
事实上,我确实建议给这个方法取一个更好的名称:openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:
因为这更准确地描述了正在发生的事情(“completionHandler”实际上是在状态更改时调用的)
您可以通过几种方式处理此问题:建议您可以在完成块中将completionHandler
设置为nil
(以确保运行一次),建议创建FBSessionStateHandler
运行一次处理程序,或者您可以打开状态更改
理想情况下,由于我们将Facebook SDK用于特定目的(登录、注销、发出请求等),这些将通过代理提供,但由于SDK开发人员显然有点被“ooh blocks!!”迷住了,您必须在第一次打开会话时定义状态更改处理程序。我认为这是一种非常糟糕的行为 FBSession具有隐藏属性:
@property (readwrite, copy) FBSessionStateHandler loginHandler;
因此,您可以通过块中的代码将其设置为nil,如下所示:
[FBSession openActiveSessionWithReadPermissions:FACEBOOK_PERMISSIONS
allowLoginUI:NO
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[[FBSession activeSession] performSelector:NSSelectorFromString(@"setLoginHandler:") withObject:nil];
#pragma clang diagnostic pop
// Your stuff...
}];
在
[FBSession.activeSession closeAndClearTokenInformation]上调用完成处理程序时,状态的值是多少当我调用[FBSession.activeSession closeAndClearTokenInformation]
时,state
的值是FBSessionStateOpen
方法,然后调用cleartokeninformation
方法?如果相同的问题仍然存在,则需要查看更多代码。也许是你的编程错误。是的,我试过了。调用“close”也会调用完成处理程序。然后发布处理facebook FBSession的整个代码。除了Adam Wallner提出的“hack”作为同一线程中的可能答案外,该问题的另一个解决方案是在完成块内检查FB session的有效状态:if(state==FBSessionStateOpen | | state==FBSessionStateOpenTokenExtended){//刚刚登录…}否则如果(错误){//登录时出错…}否则{//关闭}