iOS facebook SDK:登录已通过身份验证

Posted

技术标签:

【中文标题】iOS facebook SDK:登录已通过身份验证【英文标题】:iOS facebook SDK: Login already authenticated 【发布时间】:2012-12-27 18:01:33 【问题描述】:

我已经在我已经开发了几个月的应用程序中运行了 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 应用程序又回来了。请帮忙!

【问题讨论】:

【参考方案1】:

对我来说,这个问题实际上是一个愚蠢的问题。我在打电话

[appDelegate openSessionWithAllowLoginUI:YES];

两次由于连接了两次的按钮单击事件。只要它只被调用一次,问题就消失了!

【讨论】:

以上是关于iOS facebook SDK:登录已通过身份验证的主要内容,如果未能解决你的问题,请参考以下文章

通过 facebook ios SDK 结合 Azure 移动服务获取名字和姓氏

iPhone / iOS Facebook SDK - 您可以在应用内登录并保留登录凭据吗?

Facebook通过iOS中的Facebook SDK通过应用程序登录?

Facebook iOS SDK 和基于 Safari 的身份验证问题

Facebook iOS SDK 和护照-facebook 身份验证

如何使用带有 iOS SDK 的 Facebook 身份验证通过 DynamoDB 和 Cognito 存储用户信息