ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开

Posted

技术标签:

【中文标题】ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开【英文标题】:ios6 facebook integration login always FBSessionStateClosedLoginFailed never opens 【发布时间】:2012-09-30 12:02:02 【问题描述】:

这个问题与Facebook SDK for ios , on iOS 4.0 device 非常相似,但由于我无法在那里制作 cmets,因此我提出了一个新问题。我认为问题不一样:

当尝试将我的应用程序的 facebook 集成更新到 facebook 3.1 时,我没有让 facebook 会话打开 sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束。在我的设置中,我的 appdelegate 中有回调

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation 
    // attempt to extract a token from the url
    //    return [self.session handleOpenURL:url]; 
    return [FBSession.activeSession handleOpenURL:url];

但它永远不会被调用!它不应该被调用吗?我遵循了 facebook 文档并致电

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI 
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) 
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         ];

我也试过

openActiveSessionWithReadPermissionsnil 用于获取 facebook 教程示例中的权限,以便稍后重新授权 publish_actions 权限。同样的结果:再次出现 FBSessionStateClosedLoginFailed。

我什至试过打电话

ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) &&
        (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) )

        NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
        id account;
        if (fbAccounts && [fbAccounts count] > 0 &&
            (account = [fbAccounts objectAtIndex:0]))

            [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) 
                //we don't actually need to inspect renewResult or error.
                if (error)

                
            ];
        
    

在尝试打开会话之前,但我从来没有在我的 ios6 设备 (iphone 4s) 上打开它。在应用程序中,我被要求获得许可,但由于会话始终处于状态 FBSessionStateClosedLoginFailed,所以什么也没有发生!我对会话状态的回调是

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error

    switch (state) 
        case FBSessionStateOpen:
            if (!error) 
                // We have a valid session
                NSLog(@"User session found");
            
            break;
        case FBSessionStateClosed:
            NSLog(@"FBSessionStateClosed");
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed");
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
                                                        message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        NSLog(@"Facebook session error: %@", error.localizedDescription);
    

在 ios 5 上使用 facebook 3.0 我从来没有遇到过问题,因此我的 facebook 应用程序设置正确。我真的很感激任何帮助,让我能够打开 facebook 会话,没想到会遇到 facebook 3.1 的这些问题,并且文档在这一点上没有帮助我,谢谢

【问题讨论】:

请注意:它在 Xcode 的 ios6 和 ios5 模拟器上完美运行。仅在真实设备上它不会像描述的那样打开。设备已启用 facebook,已安装 facebook 并已连接到 facebook 帐户。 我有一个比你更奇怪的问题,在 iphone 上可以工作,在 ipad 上不行。一样的代码,是通用的app,fb逻辑上没有条件。 我也有同样的问题。你已经解决了吗? 【参考方案1】:

我也遇到了同样的问题,是因为我忘记实现了

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

    return [FBSession.activeSession handleOpenURL:url];

在我的 AppDelegate 中

【讨论】:

这就是我需要的修复。太容易被忽视了。谢谢!【参考方案2】:

虽然 JohnG 的回答是正确的,但该特定委托方法现在已成为 deprecated。使用is this的正确委托方法:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

    return [FBSession.activeSession handleOpenURL:url];

将它放在我的应用程序委托中为我解决了这个问题。没有这个,iOS 6.0 原生登录会起作用,但 Facebook 应用登录会失败。

【讨论】:

谢谢@jzn,但在我的情况下,你提到的委托方法没有被调用。有任何想法吗?谢谢。 @dredful 该回调仅用于 Facebook 应用程序/网络视图后备登录。如果您使用的是 iOS 6 登录,它将永远不会被调用,因为应用程序永远不会进入后台。你用哪种方式登录? 谢谢@jzn。我们的应用程序使用 Facebook 应用程序登录。如果用户没有安装 Facebook,则启动 web 视图然后触发。奇怪的是:如果用户是 iOS6 设置登录到 Facebook,SDK 将不会登录,无论任何其他情况。我今天将发布到 SO。 天啊。您是否看到在 Facebook 的文档“配置 XCode”部分中没有提到这种方法?以前是…… @AndreiStanescu 它仍然是必需的功能,它只是在说明的单独部分中。查看Authenticate Using Facebook Login中的第 2D 步【参考方案3】:

我遇到了同样的问题。如果用户没有在系统偏好设置中配置 Facebook 帐户,则会出现 Facebook 登录对话框,并且一切正常。但是,如果用户在设备中配置了一个帐户,我总是会遇到 FBSessionStateClosedLoginFailed 错误。

它与handleOpenURL:url 无关,因为在 iOS 6 或更高版本的“本机登录流程”中没有快速应用程序更改。所以你的应用永远不会进入后台,也不需要 URL 重定向。

问题已解决,配置 Facebook 应用程序。您需要启用“本机 iOS 登录”部分并输入您的应用程序的捆绑 ID。如果您的应用程序尚未在 Apple Store 中,恐怕您需要将沙盒模式设置为 ON。一旦您的应用在 Apple Store 中发布,我认为您需要将沙盒模式设置为 OFF 并在 Facebook 配置中设置 Apple Store ID。

【讨论】:

【参考方案4】:

即使我不能发表评论,所以把它写成答案。 我不确定,让我分析一下可能的原因 1)你说:“但它永远不会被调用!它不应该被调用吗?” -- 为

- (BOOL)application:(UIApplication *)application 
        openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation

要被调用,在 info.plist 文件中,应正确设置 url 方案,即转到 URL 类型-->Item0-->URL 方案--->Item 0,此处的值应为 fbAPPID,即 fb 附加您实际的 facebookappID [FacebookAppID 也可能出现在 info.plist 中或硬编码在代码中]。

2) 你说: "sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束"

在 sessionStateChanged 开关方法中检查 session 的状态,如果它创建或 createdTokenLoaded 然后尝试打开会话。

注意:[FBSession openActiveSessionWithPublishPermissions ....] 是一个静态方法,它会创建一个新的会话并设置为 FBSession.activeSession 其中 openWithCompletionHandler 是一个实例方法,只有在会话已经创建时才能工作。

    case FBSessionStateCreated:
    case FBSessionStateCreatedTokenLoaded:
        [session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) 
            //handle the updating of views according to the sate of session 
        ];
        break;

【讨论】:

谢谢拉维!幸运的是,我被允许评论我自己的问题;)关于对 openURL 的调用,是的,我在 info.plist 中的 url 方案配置正确,我重新检查了它,并且在 3.0 sdk 下也没有遇到任何问题!我刚刚尝试按照您的建议将带有 openWithCompletionHandler 的 FBSessionStateCreated 和 FBSessionStateCreatedTokenLoaded 添加到 sessionStateChanged 中的 switch 语句中,不幸的是,唯一的值状态始终是 FBSessionStateClosedLoginFailed ,因此永远不会调用 openWithCompletionHandler 块:( openURL 总是被正常调用吗?以及为什么相同的代码在 ios6 模拟器上运行良好的任何提示(为此,我在设置中使用相同的 facebook 帐户配置了 facebook 框架)? 当其他应用程序尝试使用 url 方案调用您的应用程序时,始终会调用 OpenURL(fbappid://... in info.plist ,您的应用程序正在向 iOS 注册方案)。我猜是模拟器没有本机应用程序并使用 safari 或 web 视图进行身份验证。这可能是黑白设备和模拟器行为不同的原因。另请注意,您在将会话发送到后台时并未关闭会话。 我不确定原因,但我在 SO 上读到 openActiveSession 正在产生问题(由于设置活动会话时的顺序),因此人们创建了自己的会话并将其设置为活动会话和然后调用 openWithCompletionHandler 。 ios6 的模拟器确实具有与设备上相同的配置方式的本机框架,并且如果配置了 safari 登录,则不使用它,这就是为什么它让我如此困惑以至于它在那里工作但不是在真机!关于后台处理我只处理 [FBSession.activeSession handleDidBecomeActive];在 applicationDidBecomeActive 和 [FBSession.activeSession close] 中;在 applicationWillTerminate 作为 facebook 文档。【参考方案5】:

我同意 JohnG 的观点,但需要额外注意的是:

请注意,如果handleOpenURL: 中有多个案例,您可以过滤:

if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
    [sourceApplication isEqualToString:@"com.facebook.Facebook"])
  //Do Stuff

这很奇怪,但我能够在多个设备上复制 sourceApplication 以“Facebook”和“facebook”的形式返回。

【讨论】:

[[sourceApplication lowercaseString] isEqualToString:@"com.facebook.facebook"] 将完成这项工作【参考方案6】:

在 FB SDK 3.5 上,您可以使用以下命令终止令牌:

    [[FBSessionTokenCachingStrategy defaultInstance] clearToken];

【讨论】:

你可以登录到你的 facebook 开发者帐户,然后在这个页面上杀死你的令牌...对测试非常有用:[link]developers.facebook.com/tools/explorerGraph API Explorer

以上是关于ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开的主要内容,如果未能解决你的问题,请参考以下文章

facebook-ios-sdk 是不是使用 iOS 6 Facebook 集成来支持登录而不打开本机 Facebook 应用程序?

如何在 iPhone 上从 Facebook 注销(本机/集成)

如何在 iOS6 上将 Facebook 框架集成到应用程序中?

iPhone 4 和模拟器上的 Facebook 登录失败

iOS Facebook登录教程[关闭]

在 facebook ios6 中没有进入 if(granted) 循环“使用 Facebook 登录”