我已经在我已经开发了几个月的应用程序中运行了 Facebook iOS SDK。在这一点上,我主要将 SDK 用于 SSO 目的。
自从我开始使用 iOS 6.0 以来,我一直看到“登录以使用带有 MY_APP 的 FB 帐户”模式阻止我当前视图的问题。
奇怪的是用户已经通过身份验证并且显然被授权使用我的应用程序。我可以获取用户的电子邮件地址等事实证明了这一点。
同样重要的是要注意,如果我单击“X”,它将关闭并且一切正常(用户已通过身份验证/授权)。如果我按照它告诉我的方式登录,它会显示“MY_APP 已被授权”模式,我无法单击“确定”按钮,但我可以单击“X”,再次让我回到我的视图,用户已通过身份验证和授权。
在这里你可以看到它:
要进行身份验证,我在以下方法中调用appdelegate
:
[appDelegate openSessionWithAllowLoginUI:YES];
以下是我的 appdelegate 中相关的 FB 方法:
// FACEBOOK STUFF
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [NSArray arrayWithObjects: @"email", nil];
return [FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
[self sessionStateChanged:session state:status error:error];
}];
}
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState)state
error:(NSError *)error {
// FBSample logic
// Any time the session is closed, we want to display the login controller (the user
// cannot use the application unless they are logged in to Facebook). When the session
// is opened successfully, hide the login controller and show the main UI.
switch (state) {
case FBSessionStateOpen: {
FBCacheDescriptor *cacheDescriptor = [FBFriendPickerViewController cacheDescriptor];
[cacheDescriptor prefetchAndCacheForSession:session];
[self sendAuthenticationStatusChangedNotification];
}
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
// FBSample logic
// Once the user has logged in, we want them to be looking at the root view.
[FBSession.activeSession closeAndClearTokenInformation];
//[self showLoginView];
break;
default:
break;
}
if (error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:error.localizedDescription
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
}
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// FBSample logic
// We need to handle URLs by passing them to FBSession in order for SSO authentication
// to work.
return [FBSession.activeSession handleOpenURL:url];
}
编辑 1
我注意到这发生在我的一部手机上,而另一部则没有。无法使用的手机安装了旧版本的 FB 应用程序。更新 FB 应用程序阻止了此问题的发生。我仍然对避免其他人遇到相同问题的修复感兴趣。
编辑 2
这个问题暂时消失了,但现在即使安装了新的 facebook 应用程序,问题又回来了。请帮忙!