ios6 facebook集成登录永远不会打开FBSessionStateClosedLoginFailed

时间:2012-09-30 12:02:02

标签: facebook ios6 facebook-ios-sdk

这个问题与Facebook SDK for iOS , on iOS 4.0 device非常相似,但由于我无法在那里发表评论,我提出了一个新问题。我认为问题不一样:

当尝试将我的应用程序的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];
                                         }];
}

我也试过

带有openActiveSessionWithReadPermissions的{​​p> nil用于Facebook教程示例中的权限,以便稍后重新授权使用publish_actions权限。相同的结果:FBSessionStateClosedLogin再次失败。

我甚至尝试过调用

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我从未遇到过问题所以我的脸书应用程序设置正确。我真的很感激任何帮助wchich让我只能打开facebook会话,没想到用facebook 3.1遇到这些问题而且文档在这一点上没有帮助我,thx

6 个答案:

答案 0 :(得分:40)

我遇到了同样的问题,因为我忘了实施

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

在我的AppDelegate

答案 1 :(得分:19)

虽然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应用程序登录将失败。

答案 2 :(得分:2)

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

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

解决了配置Facebook应用程序的问题。您需要启用“本机iOS登录”部分并放置应用程序的软件包ID。如果您的应用程序尚未在Apple Store中,我担心您需要将沙盒模式设置为ON。一旦您的应用程序在Apple Store中发布,我认为您需要将沙箱模式设置为OFF并在Facebook配置中设置Apple Store ID。

答案 3 :(得分:1)

即使我无法发表评论,也可以将其写成答案。 我不确定,让我分析潜在的原因 1)你说:“但它永远不会被召唤!不应该被召唤吗?” - 对于

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

要调用,在info.plist文件中,url方案应该正确设置,即转到URL类型 - > Item0 - > URL方案--->项目0这里的值应该是fbAPPID ie fb附加你的实际facebookappID [FacebookAppID也可能出现在info.plist中或硬编码在代码中]。

2)你说: “sessionStateChanged Callback总是以FBSessionStateClosedLoginFailed结束”

在sessionStateChanged切换方法中检查会话状态,如果创建或创建了TopLoaded,则尝试打开会话。

注意:[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;

答案 4 :(得分:0)

我同意JohnG的观点:

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

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

这很奇怪,但我能够在多个设备上复制sourceApplication作为“Facebook”和“脸谱”回来。

答案 5 :(得分:0)

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

    [[FBSessionTokenCachingStrategy defaultInstance] clearToken];