我在Facebook登录时使用了以下代码。
- (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:权限allowLoginUI:。这对我来说没有意义。我不认为这是正确的行为。有没有人见过这个问题?我们如何退出?我在iOS6上使用SDK 3.5。
答案 0 :(得分:2)
根据Facebook Developer bug追踪器上的this thread,这种行为是"设计"。
事实上,我确实建议这个方法更好的名称是:openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:
因为它更准确地描述了正在发生的事情(" completionHandler"实际上是在状态变化时被调用)。
您可以通过以下几种方式处理此问题:Ben Cohen建议您可以在完成块中将completionHandler
设置为nil
(以确保一次性运行),this answer建议创建一个FBSessionStateHandler
运行一次处理程序,或者您可以打开状态更改。
理想情况下,由于我们依赖Facebook SDK用于特定目的(登录,注销,发出请求等),这些将通过代表提供,但由于SDK开发人员显然有点被带走&# 34; ooh blocks !!",您必须在首次打开会话时定义状态更改处理程序。
答案 1 :(得分:0)
我认为这是一种非常糟糕的行为。
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...
}];