我有以下代码,我在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块! “,您不得不在首次打开会话的时候定义您的状态更改处理程序.