我有以下代码,我在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:permission allowLoginUI :.这对我来说没有意义.我不认为这是正确的行为.有没有人看到这个问题?我们如何退出?我在iOS6上使用SDK 3.5.
解决方法
根据
this thread在Facebook开发者bug追踪器,这种行为是“设计”.
其实我建议一个更好的名字这个方法将是:openActiveSessionWithReadPermissions:allowLoginUI:stateChangeHandler:
因为这更准确地描述了发生了什么(“完成亨德勒”实际上是呼吁国家改变).
您可以通过以下几种方式处理此问题:Ben Cohen建议您可以在完成块中将completionHandler设置为nil(以确保运行一次),this answer建议创建一个FBSessionStateHandler运行一次处理程序,也可以打开状态更改.
理想情况下,由于我们依赖于特定用途的Facebook SDK(登录,注销,发出请求等),这些将通过代表提供,但由于SDK开发人员显然已经被“ooh块! “,您不得不在首次打开会话的时候定义您的状态更改处理程序.